2014-10-13 3 views
1

"likes"와 "comments"라는 두 개의 테이블이 있고 각각의 특정 사용자에 대해 좋아요 및 주석 수가 포함 된 테이블을 갖고 싶습니다. SQLite에서 다음 쿼리를 작성했지만 결과는 다음과 같습니다. 모든 사용자에게 맞지 않는 경우, 두 표의 사용자에 대한 계수 값은 좋아요 수와 설명 수의 배수입니다.SQLite와 Count에서 두 테이블 조인

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 

두 테이블 모두에있는 사용자의 수를 올바르게 계산하려면 어떻게해야합니까?

답변

2

문제는 다음과 같습니다. 일부 사용자는 댓글을 가지고 있지만 좋아하지 않으며, 다른 사용자는 좋아하지만 댓글이없고, 일부 사용자는 댓글이없고, 일부 사용자는 댓글이없고 일부 사용자는 없음을가집니다. 그러므로 나는 통합 쿼리를 사용하는 것이 좋습니다 당신은 당신이 또한 좋아하는 카운트 가입 왼쪽 수있는 별도의 사용자 테이블이있는 경우 다시

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 

에 하위 쿼리를 계산 아무리 당신이 그것을 만들든지, 당신은 별도의 하위 쿼리에서 의견과 좋아 하는를 계산해야합니다. 합류 한 후 계산하면 레코드가 중복 될 수있는 결과 (왼쪽에있는 것)가 합산되어 잘못된 계산을하고있는 것입니다.