2016-07-13 45 views
1

を示すカウントし、私は、カタログからすべての情報を取得する評価テーブルを結合するとコメントテーブルに参加し、その後、私のSQLクエリーカタログ投稿のコメントをカウントする必要があります。3つのテーブルが参加して、私は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 

すべてが正常に表示されるのはto​​tal_commentsの不良番号6のみですが、コメントテーブルでは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 average、votes DESC」で正しくソートしなかったのはなぜですか?しかしDESCは解決しませんでしたどのようなもの。ボットの最後のvar_dump http://pastie.org/private/exg0mzscvgv4faiuhrobuqの結果は一番上ではありません。 – SkySonny

+0

@SkySonny。 。 。これが正しい数字を生成する場合は、ソートに関する別の質問をすることをお勧めします。 –

関連する問題