[解決済み] MySQLの複数左結合
質問
現在制作中のホームページのニュースページを作ろうとしています。私は正しい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を使用した場合、コメントのないニュースアイテムは取得できません。
関連
-
[解決済み】MAMPのmysqlサーバーが起動しない。mysqlのプロセスが起動していない
-
[解決済み] ローカルマシンからリモートDBをmysqldumpする方法
-
[解決済み] エラーコード1111。グループ関数の無効な使用
-
[解決済み] MySQLでdatetimeとtimestampのどちらのデータ型を使用すべきですか?
-
[解決済み] MySQLでコマンドラインを使用してSQLファイルをインポートするにはどうすればよいですか?
-
[解決済み] MySQLのAUTO_INCREMENTをリセットする方法
-
[解決済み] MySQLの複数行を1つのフィールドに連結することはできますか?
-
[解決済み] Railsの:includeと:joinsの比較
-
[解決済み] MySQLでLEFT JOINを使用して複数のテーブルをUPDATEする
-
[解決済み] MySQLのクエリでIF条件付きでカウントする
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】SQL文が動作しない-「オペランド型の衝突:dateはintと互換性がない」。
-
[解決済み】MySQLエラー1264:カラムの範囲外の値
-
[解決済み】MySQLのforeachループ
-
[解決済み] MySQLで「一意のテーブル/エイリアスでない」場合
-
[解決済み] テーブル 'performance_schema.session_variables' は存在しません。
-
[解決済み] Error Dropping Database (Can't rmdir '.test', errno: 17)
-
[解決済み] mysqladmin: 'localhost'のサーバーへの接続に失敗しました。
-
[解決済み] この操作を行うには、少なくとも1つのSUPER権限が必要です。
-
[解決済み] 日付の挿入時にエラーが発生しました - 日付の値が正しくありません。
-
[解決済み] エラー 2005 (hy000)。Google Cloud SQL クライアントの MySQL サーバーホスト '[35.232.51.216]' (0) が不明です。