2013-09-14 5 views
1

У меня есть 3 таблицы (пользователь, элемент, пользовательский) и 2 sql-запроса. Как я могу объединить эти два запроса?SQL INNER JOIN и COUNT

SELECT item.userid, item.id, user.name FROM item 
INNER JOIN user ON item.userid = user.id 

SELECT userid,itemid, COUNT(*) AS `liked` FROM userlike 
WHERE userid=9 
GROUP BY itemid 

Я хочу знать, понравился ли конкретный пользователь (9) или нет.

Результат должен быть Somthing как этого

itemid userid name liked* (*whether 'user 9' liked this item or not) 
1  7  foo 0 
2  4  asd 1 

Благодарности

ответ

2

Вы хотите использовать OUTER JOIN для этого

SELECT i.id itemid, u.id userid, u.name, COALESCE(liked, 0) liked 
    FROM item i JOIN user u 
    ON i.userid = u.id LEFT JOIN 
(
    SELECT itemid, COUNT(*) liked 
    FROM userlike 
    WHERE userid = 9 
    GROUP BY itemid 
) l 
    ON i.id = l.itemid; 

или

SELECT i.id itemid, u.id userid, u.name, l.userid IS NOT NULL liked 
    FROM item i JOIN user u 
    ON i.userid = u.id LEFT JOIN userlike l 
    ON i.id = l.itemid 
    AND l.userid = 9; 

Пример вывода:

 
| ITEMID | USERID | NAME | LIKED | 
|--------|--------|-------|-------| 
|  2 |  4 | user4 |  1 | 
|  1 |  7 | user7 |  0 | 

Вот SQLFiddle демо

+0

I подумайте, что в таблице 'item' нет поля' name' ... –

+0

@FabienTheSolution Спасибо за ввод. Я считаю, что у предметов есть имена. Но вы правильно смотрите на запрос OP, кажется, что это имя пользователя ожидается в наборе результатов. – peterm

+0

Спасибо @peterm, ваш ответ - это то, что я хочу. P.S: у моей таблицы пользователя есть столбец 'name' – aytek

0
SELECT item.id, item.userid, user.name, userlike.liked 
FROM item 
JOIN user ON user.id = item.userid 
JOIN userlike ON item.id = userlike.itemid 
WHERE userlike.liked = 1 
GROUP BY item.id 

ИЛИ

SELECT item.id, item.userid, user.name, userlike.liked 
FROM item 
JOIN user ON user.id = item.userid 
JOIN userlike ON item.id = userlike.itemid 
WHERE COUNT(userlike.liked) >= 1 
GROUP BY item.id 
+0

Я думаю, что нет 'liked' поля в' userlike' таблице ... –

0

Вам не нужно использовать COUNT. Вам просто нужно знать, если есть запись для определенного элемента и конкретный пользователь в userlike таблицы:

SELECT i.id as itemid, u.id as userid, u.name, 
     case when ul.userid is null then 0 else 1 end as liked 
FROM item i 
INNER JOIN user u ON i.userid = u.id 
LEFT OUTER JOIN userlike ul ON i.id = ul.itemid AND ul.userid=9 
ORDER BY i.id