1. ホーム
  2. mysql

[解決済み] MySQLの複数左結合

2022-03-10 20:01:42

質問

現在制作中のホームページのニュースページを作ろうとしています。私は正しいMySQLクエリ(複数のクエリやnum_rowsではなく、COUNT(id)とjoinを意味します)を使用したいと考えました。PDO ラッパーを使用していますが、これは問題なく機能するはずで、MySQL CLI アプリケーションから直接実行すると、まだ失敗します。

基本的に、私は3つのテーブルを持っています。1つはニュース、1つはコメント、1つはユーザーを保持しています。私の目的は、ニュースのタイトル、本文、著者、日付をすべて(後でページ分割する)表示するページを作成することです。これは、ユーザー名を取得するために2番目のクエリを使用したときにうまく機能しましたが、私はむしろJOINを使用することに決めました。

では、何が問題なのか?2つの結合が必要なんです。一つは著者のユーザー名を得るため、もう一つはコメント数を得るためです。単に著者のユーザー名を取得する場合、すべては期待どおりに動作します。ニューステーブルのすべての行(2つある)が表示されます。しかし、コメント行のために2つ目のLEFT JOINを追加すると、結局newsから1行しか受け取れず(2行あることを思い出してください)、COUNT(comments.id)は2を表示します(各記事にコメントがあるので、1を表示するはずです)。

何が間違っているのでしょうか?2つのニュース記事があり、それぞれ1つのコメントがあるのに、なぜ1つのニュース記事しか表示されず、2つのコメントがあると言っているのでしょうか?

SELECT news.id, users.username, news.title, news.date, news.body, COUNT(comments.id)
FROM news
LEFT JOIN users
ON news.user_id = users.id
LEFT JOIN comments
ON comments.news_id = news.id

また、もう一つ確認しておきたいのですが、コメントへの左結合は、コメントの有無にかかわらず、すべての投稿を取得する正しい方法なのですよね?それとも右結合になるのでしょうか?ああ、最後にもう一つ... comments.news_id = news.id を news.id = comments.news_id に変えると、結果が0になります。

解決方法は?

GROUP BY句が抜けています。

SELECT news.id, users.username, news.title, news.date, news.body, COUNT(comments.id)
FROM news
LEFT JOIN users
ON news.user_id = users.id
LEFT JOIN comments
ON comments.news_id = news.id
GROUP BY news.id

左結合が正しいです。INNERまたはRIGHT JOINを使用した場合、コメントのないニュースアイテムは取得できません。