web-dev-qa-db-ja.com

MySQL複数の左結合

作業中のWebサイトのニュースページを作成しようとしています。正しいMySQLクエリ(複数のクエリまたはnum_rowsの代わりにCOUNT(id)とjoinを意味する)を使用することにしました。正常に機能するPDOラッパーを使用しています。 MySQL CLIアプリケーション。

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

だから問題は何ですか?さて、2つの結合が必要です。 1つは著者のユーザー名を取得し、もう1つはコメントの数を取得することです。作成者のユーザー名を入力するだけで、すべて正常に機能します。ニューステーブルのすべての行(2つあります)が表示されます。ただし、この2番目のLEFT JOINをコメント行に追加すると、ニュースから1行しか受信せず(2があることを思い出してください)、COUNT(comments.id)は2を返します(1を表示するはずです)各投稿のコメント。)

私は何を間違えていますか?それぞれが1つのコメントを持つ2つのニュース投稿があるときに、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

また、もう1つ確認しておくと、コメントへの左の参加は、コメントがあるかどうかに関係なく、すべての投稿を取得する正しい方法です。それとも正しい参加でしょうか?ああ、最後の1つです... comments.news_id = news.idをnews.id = comments.news_idに切り替えた場合、結果は0になります。

53
John M.

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を使用した場合、コメントのないニュースアイテムは取得できません。

100
Mark Byers

各ニュース投稿タイトルのすべての詳細を表示するには主キーである「news.id」、「news.id」に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
7
rizon

各ニュース投稿タイトルのすべての詳細を表示するには主キーである「news.id」、「news.id」に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
0
Youssof Hammoud