質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

2回答

3635閲覧

MySQLでHAVINGを使った値の抽出について

x193

総合スコア16

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

0クリップ

投稿2016/10/24 08:32

フィールドA|フィールドB
ーーーーーーーーーーーーー
1 | 1
1 | 3
1 | 5
2 | 2
2 | 4
3 | 1
3 | 3
3 | 4

ちょっとわかりにくいかもですが、上記のようなテーブルがあった時、
例えばBの値が1、3、4になるフィールドAの値を抽出したい場合(上記の場合「3」が欲しい)、
GROUP BYとHAVING句を使って

(前略) GROUP BY フィールドA HAVING フィールドB = 1 OR フィールドB = 3 OR フィールドB = 4

としたのですが当然、フィールドAの値が3以外のものも含まれてしまいます。

試行錯誤しましたが中々思うように行かず・・・。
どうすれば欲しい結果を求められるのでしょうか・・・?

どなたかご教授くださいませm(_ _)m

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

PineMatsu

2016/10/24 08:38

どういうことでしょうか?もしかして、B=1 or 3 or 4の時のAの値が全て同じものと言うことでしょうか?
x193

2016/10/24 08:40

いえ、上記の場合だとAが3の値だけがほしいのですが、実際は1と2も返ってきてしまいます。
x193

2016/10/24 08:41

ご質問の回答になってますでしょうか。。。
PineMatsu

2016/10/24 09:11

言い方が悪かったかな?Bの値が1,3,4すべて揃ってるAの値ということですよね?
x193

2016/10/24 09:13

そうですね、おっしゃるとおりです!
guest

回答2

0

既に解決済みではありますが、、

フィールドA、フィールドB に複合ユニークインデックスが張ってあるなら、akio221様の回答と同様、

sql

1SELECT field_a FROM test WHERE field_b IN (1, 3, 4) GROUP BY field_a HAVING COUNT(*) = 3;

もし、フィールドA、フィールドB の値が重複するレコードがあり得るなら、

sql

1SELECT tmp.field_a FROM ( 2 SELECT DISTINCT field_a, field_b FROM test WHERE field_b IN (1, 3, 4) 3) AS tmp GROUP BY tmp.field_a HAVING COUNT(*) = 3;

もちろん、HAVING COUNT(*) = 3部分の'3'は
WHERE field_b IN (...)の'...'部分に指定する値の個数と一致させる必要があります。

sql

1mysql> CREATE TABLE test ( 2 -> field_a int, 3 -> field_b int 4 -> ); 5Query OK, 0 rows affected (0.05 sec) 6 7mysql> INSERT INTO test VALUES 8 -> (1, 1), 9 -> (1, 3), 10 -> (1, 5), 11 -> (2, 2), 12 -> (2, 4), 13 -> (3, 1), 14 -> (3, 3), 15 -> (3, 4); 16Query OK, 8 rows affected (0.00 sec) 17Records: 8 Duplicates: 0 Warnings: 0 18 19mysql> SELECT * FROM test; 20+---------+---------+ 21| field_a | field_b | 22+---------+---------+ 23| 1 | 1 | 24| 1 | 3 | 25| 1 | 5 | 26| 2 | 2 | 27| 2 | 4 | 28| 3 | 1 | 29| 3 | 3 | 30| 3 | 4 | 31+---------+---------+ 328 rows in set (0.00 sec) 33 34mysql> SELECT field_a FROM test WHERE field_b IN (1, 3, 4) GROUP BY field_a HAVING COUNT(*) = 3; 35+---------+ 36| field_a | 37+---------+ 38| 3 | 39+---------+ 401 row in set (0.00 sec) 41 42mysql> INSERT INTO test VALUES (1, 3), (1, 3); 43Query OK, 2 rows affected (0.00 sec) 44Records: 2 Duplicates: 0 Warnings: 0 45 46mysql> SELECT * FROM test ORDER BY field_a, field_b; 47+---------+---------+ 48| field_a | field_b | 49+---------+---------+ 50| 1 | 1 | 51| 1 | 3 | 52| 1 | 3 | 53| 1 | 3 | 54| 1 | 5 | 55| 2 | 2 | 56| 2 | 4 | 57| 3 | 1 | 58| 3 | 3 | 59| 3 | 4 | 60+---------+---------+ 6110 rows in set (0.00 sec) 62 63mysql> SELECT tmp.field_a FROM ( 64 -> SELECT DISTINCT field_a, field_b FROM test WHERE field_b IN (1, 3, 4) 65 -> ) AS tmp GROUP BY tmp.field_a HAVING COUNT(*) = 3; 66+---------+ 67| field_a | 68+---------+ 69| 3 | 70+---------+ 711 row in set (0.00 sec)

投稿2016/10/24 09:02

KiyoshiMotoki

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

x193

2016/10/24 09:06

少ない情報でしたのに、詳細な解説ありがとうございます! 重複する場合のまで解説いただき、勉強になります!
guest

0

ベストアンサー

GROUP BY フィールドA HAVING フィールドB = 1 OR フィールドB = 3 OR フィールドB = 4

ご提示の例の場合、
・フィールドAの集約 1,3,5
・その中からBが1,3,4を取る値
を求めてしまいます。

1,3,4が可変である場合、件数の計数を絞る工夫が要りますが

where B in (1,3,4)
group by A
having count(A) = 3

ここらあたりが妥当ではないでしょうか。

投稿2016/10/24 08:44

akio221

総合スコア716

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

x193

2016/10/24 08:52

ありがとうございます! 提示いただいたもので実現できたようです。 >・フィールドAの集約 1,3,5 >・その中からBが1,3,4を取る値 >を求めてしまいます。 なるほど、先に絞り込んでおく必要があったわけですね。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問