LAMP環境で開発をしています。
SQL文でCOUNTを求める際に、まとめて結果を求めようとして上手く行きません。
状況としては以下です。
テーブルdはidをkeyにa,b,c3つのテーブルとjoinしています。
id = 1の場合、テーブルa,b,cにマッチするレコードがそれぞれに4個、1個、0個あります。
ひとつひとつを
SELECT
COUNT(CASE WHEN a.name IS null THEN 1 ELSE null END) as a_count
FROM d
INNER JOIN a ON a.id = d.id
WHERE d.id = 1
として結果を求めると4,1,0と出るのですが、まとめて
SELECT
COUNT(CASE WHEN a.name IS null THEN 1 ELSE null END) as a_count,
COUNT(CASE WHEN b.name IS null THEN 1 ELSE null END) as b_count,
COUNT(CASE WHEN c.name IS null THEN 1 ELSE null END) as c_count
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
とすると28,5,0という値が返されます。
どのように書けば正しい4,1,0を得られるのでしょうか?
よろしくお願いします。
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ひとつひとつに対して結果を求めるのが自然だと思います。
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
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) アクセス 削除するレコードを含んだテーブルを指定してくださいのエラー対処方法 1 2022/11/24 15:01
- MySQL 次の時間帯の勝率の合計を求めるSQL文 1 2023/07/04 17:12
- その他(プログラミング・Web制作) Rでのスクリプトのご相談 3 2022/12/08 16:22
- Access(アクセス) アクセス テーブルの空白を変数に置換するボタンが作りたい 4 2022/07/08 11:19
- UNIX・Linux 次の要件を満たすにはどのように修正したらよろしいでしょうか 1 2022/11/24 20:57
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- PostgreSQL 画像とカテゴリーを出力したいのですが、取得の条件を付ける方法がわかりません。 2 2022/05/01 18:03
- MySQL エラー 1068 (42000): 複数の主キーが定義されていますエラー 2 2022/11/17 04:36
- Visual Basic(VBA) エクセル マクロ(A1:A10)までの中で一番多く出た数字をB10に表示 6 2023/04/25 17:01
- Oracle 下記のsqlで取得されるレコード以外を取得する方法ありますでしょうか。 SELECT B.番号, B 2 2022/04/20 23:21
このQ&Aを見た人はこんなQ&Aも見ています
-
風水の観点で選ぶ観葉植物とは?置き場所や上げたい運気ごとの注意点を紹介!
観葉植物で運気をアップするコツを、風水デザイン1級建築士の福島昌彦さんに伺った。
-
複数テーブルにわたるCOUNT
MySQL
-
GROUP BYを行った後に結合したい。
Oracle
-
count関数の値をwhere句で使用する方法について
MySQL
-
-
4
件数とデータを同時に取得するには?
Oracle
-
5
ウォッチ式の文字数制限について
Visual Basic(VBA)
-
6
count(1)とcount(*)の違い
Oracle
-
7
単一グループのグループ関数ではありません。
Oracle
-
8
複数カラムを跨いだCOUNTができない
PostgreSQL
-
9
2つのテーブルのカウント結果を1行で取得
SQL Server
-
10
文字列の後ろから必要分だけ削除したい。
Visual Basic(VBA)
-
11
SQLでSUMなどの関数でデータが無い時に0を返したい。
Oracle
-
12
複数のテーブルから値を合計出力するSQLについて
MySQL
-
13
ソースコードの1行が長いときの折り返し
PHP
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
複数テーブルのGROUP BY の使い...
-
SQLサーバから、項目の属性(型...
-
副問合せの書き方について
-
WordpressのContact form 7でzi...
-
[MySQL] 1対多のリレーションで...
-
MySQL NULLだけをカウントして...
-
Yahoo .comの idには年齢制限、...
-
VIEWの元のテーブルのindexって...
-
android.R.id.text1はどこにある
-
液晶テレビの色鉛筆の落書きを...
-
JOIN後同一名カラムから値がと...
-
URL と行番号の指定
-
1対多結合で多を絞り込み条件と...
-
green houseのGH-YMP24-GD...
-
mysqlで特定のカラムから下4桁...
-
別テーブルからSELECTした値を...
-
学校の課題のSQLでVIEWの意味と...
-
MySQL 複数個の値を取るカラム...
-
複数JOINしているとCOUNTが正し...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
SQL Left Join で重複を排除す...
-
副問合せの書き方について
-
SQLサーバから、項目の属性(型...
-
VIEWの元のテーブルのindexって...
-
select文のwhere句に配列を入れ...
-
selectした大量データをinsert...
-
センノシド異性体構造式
-
Unionした最後にGROUP BYを追加...
-
insertを高速化させたい
-
SQLにて特定の文字を除いた検索...
-
マイクラPC版のコマンドで効率...
-
ある条件の最大値+1を初番する...
-
inner joinをすると数がおかし...
-
sqlで、600行あるテーブルを100...
-
エクセルの関数について教えて...
-
Access パラメータクエリをcsv...
-
URL と行番号の指定
-
複数テーブルのGROUP BY の使い...
-
PL/SQLの変数について
おすすめ情報