在SQLite和Count中加入两个表

时间:2014-10-13 12:59:06

标签: sqlite join count

我有两个名为“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

如何为两个表中存在的用户获取正确的计数值?

1 个答案:

答案 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

无论你如何制作它,你都必须在不同的子查询中计算评论和喜欢。如果您在加入后计算,那么您可以对记录可能重复的结果(左侧的记录)进行求和,并得出错误的计数。