2012-05-03 3 views
5

Mam schemat ten POST WITH FEEDSPHP mysql jak związek trzy tabele pokazujące wyjść z różnych tabel

Co chcę zrobić, to mieć to wyjście: Likes post - like Facebook

Jak uda Ci się wykonać zapytanie tego jednego ?

Mam ten kod

SELECT users.firstname, users.lastname, 
     users.screenname, posts.post_id, posts.user_id, 
     posts.post, posts.upload_name, 
     posts.post_type, posts.date_posted 
FROM website.users users 
INNER JOIN website.posts posts ON (users.user_id = posts.user_id) 
ORDER BY posts.pid DESC 
//PROBLEM with this one is that it only views the post from all users. 

//SO I added 
SELECT COUNT(user_id) AS friends, SUM(user_id = ?) AS you, user_id 
FROM feeds WHERE post_id = ? 
//This one will give you two fields containing how many different users **feeds** the 
post 

Proszę o pomoc chłopaki. Właściwie to właśnie podążam za Stan Facebooka "LIKE" Jedyną rzeczą jest to, że nie jestem amatorem z tego rodzaju materiałami, więc z przyjemnością wysłucham wszystkich twoich odpowiedzi. Naprawdę potrzebuję twojej pomocy

Odpowiedz

3

Jeśli ja zrozumiałem, chcesz dołączyć zewnętrzną z tabeli feeds (w celu zachowania wszystkich posts nawet jeśli nie są związane feeds), następnie GROUP BY post.pid, aby połączyć się ze sobą wszystko takie kanały dla każdego postu i żądane informacje.

używam GROUP_CONCAT() funkcji MySQL, aby uzyskać listę oddzielonych przecinkami wszystkich użytkowników (do group_concat_max_len), którzy „Kanał” dla danego stanowiska (można zmienić separator z modyfikatorem SEPARATOR, jeśli zachodzi taka potrzeba) .

SELECT users.firstname, users.lastname, 
     users.screenname, posts.post_id, posts.user_id, 
     posts.post, posts.upload_name, 
     posts.post_type, posts.date_posted, 
     COUNT(feeds.user_id) AS friends, -- number of "likes" 
     SUM(feeds.user_id = ?) AS you,  -- did I like this? 
     GROUP_CONCAT(feeds.user_id)  -- who likes it? 
FROM website.users users 
INNER JOIN website.posts posts ON (users.user_id = posts.user_id) 
LEFT JOIN website.feeds feeds ON (posts.post_id = feeds.post_id) 
GROUP BY posts.pid 
ORDER BY posts.pid DESC 

UPDATE

Aby uzyskać pełną nazwę użytkowników, którzy "lubianych" stanowisko, z wyłączeniem samego siebie, trzeba dołączyć do tabela users po raz drugi:

SELECT users.firstname, users.lastname, 
     users.screenname, posts.post_id, posts.user_id, 
     posts.post, posts.upload_name, 
     posts.post_type, posts.date_posted, 
     COUNT(feeds.user_id) AS friends,      -- number of "likes" 
     SUM(feeds.user_id = ?) AS you,      -- did I like this? 
     GROUP_CONCAT(
     CASE WHEN NOT likes.user_id = ? THEN    -- exclude self 
      CONCAT_WS(' ', likes.firstname, likes.lastname) -- full names 
     END 
     ) 
FROM website.users users 
INNER JOIN website.posts posts ON (users.user_id = posts.user_id) 
LEFT JOIN website.feeds feeds ON (posts.post_id = feeds.post_id) 
LEFT JOIN website.users likes ON (feeds.user_id = likes.user_id) 
GROUP BY posts.pid 
ORDER BY posts.pid DESC 
+0

Dzięki bardzo kolego! Ale bracie, o tym wierszu "SUMA (user_id =?) JAK TY, - czy mi się to podobało? GROUP_CONCAT (user_id)" czy powinien to być "feeds.user_id"? Mam błąd z informacją: "Kolumna user_id na liście pól jest niejednoznaczna –

+0

Tak, przepraszam:" feeds.user_id "Zaktualizowano – eggyal

+0

Dziękuję wam bardzo za waszą pomoc! –

2

Jeśli chcesz zrobić to dla wszystkich użytkowników, a jednocześnie odbierać pliki, You ha ve dołączyć feed tabeli:

SELECT u.firstname, u.lastname, 
    u.screenname, p.post_id, p.user_id, 
    p.post, p.upload_name, 
    p.post_type, p.date_posted, 
    COUNT(f.user_id) AS friends, SUM(f.user_id = ?) AS you 
FROM website.users u 
INNER JOIN website.posts p ON (u.user_id = p.user_id) 
LEFT JOIN website.feeds f ON (p.post_id = f.post_id) 
GROUP BY p.pid 
ORDER BY p.pid DESC 

Ten powinno wystarczyć ...

+0

Dzięki kolego! próbując wszystko zrozumieć –

+0

@PeterWateber Nie ma za co. – shadyyx