0

簡単な記事とコメントのテーブルがあります。記事をコメントとともに表示したい。同じテーブルで、コメント付きの選択とコメントなしの別の選択を結合したいと考えています。記事番号 1 にはコメントが 1 つあり、記事番号 2 にはコメントがなく、記事番号 3 にはコメントが 2 つ含まれています。

記事テーブル:

articles.id | articles.content
   1        |  test article
   2        |  test another
   3        |   test third

コメント表:

comments.id | comments.aid | comments.comment
  1         |   1          |  bad one
  2         |   3          |  very good
  3         |   3          |   good          

次のクエリを使用して結果を取得します。

SELECT articles.id AS article_id,
comments.id AS comment_id,
comment
FROM articles
LEFT JOIN comments ON comments.aid = articles.id
UNION ALL
SELECT articles.id AS article_id,
NULL,
NULL
FROM articles
GROUP BY article_id
ORDER BY article_id DESC

私が得た結果は正しいです:

article_id | comment_id | comment
   3       | 3          | good
   3       | 2          | very good
   3       | NULL       | NULL
   2       | NULL       | NULL
   2       | NULL       | NULL
   1       | NULL       | NULL
   1       | 1          | bad one

コメントもカウントしたい場合は、クエリに COUNT を追加すると、次のようになります。

SELECT articles.id AS article_id,
comments.id AS comment_id,
comment ,
COUNT(DISTINCT comments.id) AS count_comments
FROM articles
LEFT JOIN comments ON comments.aid = articles.id
UNION ALL
SELECT articles.id AS article_id,
NULL,
NULL ,
NULL
FROM articles
GROUP BY article_id
ORDER BY article_id DESC

カウント列を追加すると結果が変わり、すべての行が出力されるわけではありません。

article_id | comment_id | comment   | count_comments
  3        | NULL       | NULL      |  NULL
  2        | NULL       | NULL      |  NULL  
  1        | NULL       | NULL      |  NULL
  1        | 1          | bad one   |  3 

これで、記事 1 のコメント以外のコメントは表示されなくなり、ID(2) は 2 つの選択コマンドに対して 2 回表示され、ID(3) は 3 回 (2 番目の選択コマンドに対して 1 つ、最初の選択コマンドに対して 2 つ) 表示されるはずです。コメントが 2 つあるので、コマンドを選択してください)

私が期待する正しい結果:

article_id | comment_id | comment   | count_comments
   3       | 3          | good      |   2 
   3       | 2          | very good |   2
   3       | NULL       | NULL      |   NULL  
   2       | NULL       | NULL      |   NULL
   2       | NULL       | NULL      |   NULL
   1       | NULL       | NULL      |   NULL 
   1       | 1          | bad one   |    1

count を追加すると ths になる理由がわかりません。

ありがとう

4

1 に答える 1