2016-07-13 3 views
1

을 보여주는 카운트 나는, 카탈로그에서 모든 정보를 얻을 등급 테이블에 가입 코멘트를 테이블에 가입 한 후, 내 SQL 쿼리 카탈로그 게시물로 의견을 계산해야합니다세 개의 테이블 조인 내가 3 개 테이블이 잘못된 결과

SELECT 
    catalog.catalog_id, 
    catalog.slug, 
    catalog.title, 
    catalog.city, 
    catalog.street, 
    catalog.image COUNT(ratings.rate) AS votes, 
    COUNT(comments.catalog_id) AS total_comments, 
    ROUND(SUM(ratings.rate)/COUNT(ratings.rate)) AS average 
FROM 
    catalog 
LEFT JOIN ratings ON ratings.object_id = catalog.catalog_id 
LEFT JOIN comments ON comments.catalog_id = catalog.catalog_id 
GROUP BY 
    catalog.catalog_id 
ORDER BY 
    average, 
    votes DESC 

모든 것이 6 번만 total_comments의 잘못된 번호를 보여 주지만, 2 번 행의 주석 표에는 나쁜 결과가 표시됩니다. 그룹화에 문제가 있다고 생각합니다. GROUP BY catalog.catalog_id, comments.catalog_id을 추가하려했지만 도움이되지 않았습니다. 내 테이블 :

enter image description here

답변

2

문제는 당신이 각 게시물에 대한 카티 제품을지고 있도록 여러 등급 및 의견을 가지고있다.

올바른 해결책은 합류하기 전에 데이터를 사전 집계하는 것입니다.

SELECT c.*, r.votes, c.total_comments, 
     ROUND(sumrate/votes) AS average 
FROM catalog c LEFT JOIN 
    (SELECT r.object_id, COUNT(*) as votes, SUM(r.rate) as sumrate 
     FROM ratings r 
     GROUP BY r.object_id 
    ) r 
    ON r.object_id = c.catalog_id LEFT JOIN 
    (SELECT c.catalog_id, COUNT(*) as total_comments 
     FROM comments c 
     GROUP BY c.catalog_id 
    ) c 
    ON c.catalog_id = c.catalog_id 
GROUP BY c.catalog_id 
ORDER BY average, votes DESC; 
+0

예! 작동합니다. 결과는 거의 좋았지 만, 지금은 내가 왜 평균은 ORDER BY, ORDER BY DESC로 제대로 작동하지 않았는지 이해하지 못합니다. 평균이 가장 높고 득표가 상위에서 봇으로 바뀌기 때문에 DESC가 해결하지 못했습니다. 무슨 일이. 봇의 마지막 var_dump http://pastie.org/private/exg0mzscvgv4faiuhrobuq의 내 결과가 맨 위에 표시되지 않습니다. – SkySonny

+0

@SkySonny. . . 올바른 숫자가 나오면 분류에 대한 다른 질문을하는 것이 좋습니다. –