我有两张桌子:
主题表:
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”来离开主题和表格,但这会遗漏用户喜欢但不喜欢的主题。任何人都可以帮我查询吗?非常感谢。
答案 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 = ?
答案 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
答案 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
,那么您将需要在查询中的某个位置聚合(或不同)。此方法不需要该操作。