- ベストアンサー
複数JOINしているとCOUNTが正しく取得できない!SQLのCOUNTの使い方について教えてください
- LAMP環境で開発をしており、SQL文でCOUNTを求める際に問題が発生しています。
- 複数のJOINを使用して結果をまとめて取得しようとすると、期待した結果が得られません。
- 正しい結果を得るためには、COUNTの使い方に注意する必要があります。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
テーブル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ひとつひとつに対して結果を求めるのが自然だと思います。
その他の回答 (1)
- yambejp
- ベストアンサー率51% (3827/7415)
たぶんこんな感じを期待しているのだとおもうけど かならず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
お礼
参考にさせて頂きました。 ありがとうございました。
お礼
ご明察です。 楽しようとすると逆にこういうことになってしまいますね。 ありがとうございました。