• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:複数JOINしているとCOUNTが正しく取得できな)

複数JOINしているとCOUNTが正しく取得できない!SQLのCOUNTの使い方について教えてください

このQ&Aのポイント
  • LAMP環境で開発をしており、SQL文でCOUNTを求める際に問題が発生しています。
  • 複数のJOINを使用して結果をまとめて取得しようとすると、期待した結果が得られません。
  • 正しい結果を得るためには、COUNTの使い方に注意する必要があります。

質問者が選んだベストアンサー

  • ベストアンサー
  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.1

テーブルa内にid=1の行は5行存在。うち4行はnameがnullで,1行はname登録済。 テーブルb内にid=1の行は7行存在。うち1行はnameがnullで,6行はname登録済。 テーブルc内にid=1の行は1行存在。その1行はname登録済で,nameがnullは無し。 これを次のSQL文で結合すれば, 出力される行数は 5×7×1=35行分。 SELECT * FROM d INNER JOIN a ON a.id = d.id INNER JOIN b ON b.id = d.id INNER JOIN c ON c.id = d.id WHERE d.id = 1 そのうち, a.nameがnullなのは(4)×7×1=28行分, b.nameがnullなのは5×(1)×1= 5行分, c.nameがnullなのは5×7×(0)= 0行分。 > どのように書けば正しい4,1,0を得られるのでしょうか? 無意味にテーブルa,b,cを結合していること自体が正しくないわけですから, テーブルa,b,cひとつひとつに対して結果を求めるのが自然だと思います。

bacchus047
質問者

お礼

ご明察です。 楽しようとすると逆にこういうことになってしまいますね。 ありがとうございました。

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

たぶんこんな感じを期待しているのだとおもうけど かならずnameがユニークだとは限らないためnameで判断するのは微妙 SELECT count(DISTINCT a.name) as a_count ,count(DISTINCT b.name) as b_count ,count(DISTINCT c.name) as c_count FROM d LEFT JOIN a ON a.id = d.id LEFT JOIN b ON b.id = d.id LEFT JOIN c ON c.id = d.id WHERE d.id = 1

bacchus047
質問者

お礼

参考にさせて頂きました。 ありがとうございました。