对不起,笨拙的标题。一个例子将解释。
假设我有一个喜欢表,每个喜欢都有一个条目
user_id | liked_id
--------------------
1 | a
2 | a
1 | b
2 | c
表示用户1
喜欢项目a
和b
,并且用户2
喜欢项目a
和c
。
要获得每个项目的总喜欢数,我可以这样做:
SELECT liked_id, COUNT(*)
FROM likes
GROUP BY liked_id
但是,有没有一种好方法可以做到这一点,但仅限于特定用户喜欢的项目?因此,例如,查询 user 1
,我想要的结果是:
liked_id | count
------------------
a | 2
b | 1
因为用户1
喜欢项目a
和b
,但不是c
。
我能想到的最好的是一个JOIN
或IN
带有一个子选择:
SELECT l.liked_id, count(*)
FROM likes l
JOIN (
SELECT liked_id
FROM likes
WHERE user_id = 1
) l2
ON l.liked_id=l2.liked_id
GROUP BY l.liked_id;
聚合时有没有更好的方法来汇总?我觉得我可能会做一些HAVING
诡计,但也许不会,而且它可能是一个较慢的解决方案。
编辑:我正在使用 Postgres,如果标签没有说清楚的话。
编辑:感谢所有答案,当我问这个问题时,我接受了我认为最好和最快的答案 - 应该很明显,真的,但我给了每个人一个 +1。
我应该提到我需要从 likes 表中的条目中获取另一条数据,以便稍后订购。子选择将执行此操作,因为接受的答案将在SELECT
和GROUP BY
部分中添加一个附加条目。这将教会我为一个 SO 问题过度简化一些东西......谢谢!