1

私は mysql を使用しており、ほぼ完全に機能するクエリがあります。次の3つのテーブルがあります。

論文

  • article_id

コメント

  • comment_id
  • article_id

意見

  • view_id
  • article_id

そして、このすべての情報を 1 つのクエリにまとめたいと考えています。各記事の閲覧数とコメント数を知りたいです。私は今日、何人かの素晴らしい人々の助けを借りて何とか作ることができましたが、また立ち往生しています.

SELECT article.id_article,
       COUNT(view.id_article),
       COUNT(comment.id_article) 
FROM article LEFT JOIN view ON article.id_article = view.id_article 
             LEFT JOIN comment ON article.id_article = comment.id_article 
GROUP BY id_article 
ORDER BY id_article

何が起こるかというと、最初の行だけが間違った結果を示しています。4 つのコメントと 3 つのビューの代わりに、両方に 24 が表示されます。残りはすべて問題ないため、理由はわかりません。コメント数が 4 倍になり、コメントとビューの両方で最初の行に再現されているようです。

4

1 に答える 1

1

結合でデカルト積を取得しています:

1 記事 * 4 ビュー * 3 コメント = 12

24 を取得している理由がわからない場合は、最初の行に同じ ID を持つ 2 つの記事がある可能性があります。

SELECT article.id_article,
       COUNT(distinct view.id_view),
       COUNT(distinct comment.id_comment) 
FROM article LEFT JOIN view ON article.id_article = view.id_article 
             LEFT JOIN comment ON article.id_article = comment.id_article 
GROUP BY id_article 
ORDER BY id_article

このクエリを記述する別の方法は次のとおりです。

   SELECT article.id_article,
          v.n_views,
          c.n_comments
     FROM article 
LEFT JOIN (SELECT article_id,
                  count(*) n_views
             FROM view 
         GROUP BY article_id) v ON article.id_article = v.id_article 
LEFT JOIN (SELECT article_id,
                  count(*) n_comments
             FROM comment 
         GROUP BY article_id) c ON article.id_article = c.id_article 
    GROUP BY id_article 
    ORDER BY id_article
于 2013-10-21T16:58:08.507 に答える