Mysql离开了联接以获得独特的主题

时间:2014-06-08 18:01:21

标签: mysql sql join left-join

我有两张桌子:

主题表:

topic_id
2
3
4

喜欢表:

topic_id         user_id
2                4
2                6
3                1
4                2

对于已登录的用户(使用$ user_id表示),我需要返回唯一主题和一个标记,以指示此用户是否喜欢此帖子。 对于上面的示例,如果登录用户的用户标识为2,则返回值应为:

topic_id        liked
2               0 or NULL
3               0 or NULL
4               1

我曾尝试使用“like.user_id = $ user_id或like.user_id为NULL”来离开主题和表格,但这会遗漏用户喜欢但不喜欢的主题。任何人都可以帮我查询吗?非常感谢。

3 个答案:

答案 0 :(得分:1)

您可以列出主题表中的所有主题,并使用LEFT JOIN将它们与来自同一表的行合并。之后,您可以使用user_id过滤IF列:如果是null,则此主题没有与此用户相关的记录,因此标记为0,否则标记为1

SELECT t.topic_id
     , IF(l.user_id IS NULL, 0, 1) AS liked
FROM topic t LEFT JOIN like l ON t.topic_id= l.topic_id AND l.user_id = ?

SQLFiddle

答案 1 :(得分:0)

您可以这样做,通过使用您的用户ID条件总和将为您提供用户喜欢的每个主题的计数,如果用户不喜欢则为0

select t.*,sum(lk.user_id = 2) liked from topic t
left join like_t lk on(t.topic_id= lk.topic_id)
group by t.topic_id

Demo

答案 2 :(得分:0)

如果您想要所有主题,那么最有效的方法是使用嵌套选择:

select t.*,
       (case when exists (select 1 from likes l where t.topic_id = l.topic_id)
             then 1
             else 0
        end) as liked
from topics t;

为获得最佳性能,请在likes(topic_id)上创建索引。

如果您使用join,那么您将需要在查询中的某个位置聚合(或不同)。此方法不需要该操作。