我有两个名为“likes”和“comments”的表,我希望有一个表格,其中包含对每个特定用户的喜欢和评论的计数,我在SQLite中编写了以下查询,但结果并非适用于所有用户,计数两个表中用户的值是喜欢数量和评论数量的倍数。
SELECT
likes.liker_name, likes.liker_id, likes.profile_picture ,
COUNT(comments.commenter_name) AS comment_count, COUNT( likes.liker_id) AS like_count
FROM likes
LEFT JOIN comments
ON likes.liker_name = comments.commenter_name
GROUP BY
likes.liker_name
ORDER BY
COUNT( likes.liker_id) DESC
如何为两个表中存在的用户获取正确的计数值?
答案 0 :(得分:3)
问题是:有些用户有评论但没有喜欢,有些用户喜欢但没有评论,有些用户同时有,有些用户没有。因此,我建议使用联合查询并再次总结那个
SELECT
u.name, u.id, u.profile_picture,
SUM(u.like_count) AS like_count, SUM(u.comment_count) AS comment_count
FROM (
SELECT
liker_name AS name, liker_id AS id, profile_picture,
COUNT(*) AS like_count, 0 AS comment_count
FROM
likes
GROUP BY
liker_name, liker_id, profile_picture
UNION ALL
SELECT
commenter_name AS name, commenter_id AS id, profile_picture,
0 AS like_count, COUNT(*) AS comment_count
FROM
comments
GROUP BY
commenter_name, commenter_id, profile_picture
) AS u
GROUP BY
u.name, u.id, u.profile_picture
如果您有一个单独的用户表,您还可以将喜欢计数和评论计数子查询连接到用户表
SELECT
u.name, u.id, u.profile_picture, l.cnt AS like_count, c.cnt AS comment_count
FROM
users u
LEFT JOIN
(SELECT liker_id, COUNT(*) AS cnt
FROM likes
GROUP BY liker_id
) AS l
ON u.user_id = l.liker_id
LEFT JOIN
(SELECT commenter_id, COUNT(*) AS cnt
FROM comments
GROUP BY commenter_id
) AS c
ON u.user_id = c.commenter_id
WHERE l.cnt > 0 OR c.cnt > 0
无论你如何制作它,你都必须在不同的子查询中计算评论和喜欢。如果您在加入后计算,那么您可以对记录可能重复的结果(左侧的记录)进行求和,并得出错误的计数。