みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

group by とhaving

こんにちは。

グループ化した後に条件で摘出する方法について教えて頂けますでしょうか。

例えば、以下のようなテーブルを作ったとして、

テーブル
id tag_no
1 5
1 6
1 7
1 8
1 9
2 5
2 10
2 11
3 5
3 9
3 10

指定したtag_noを持つidを摘出したいのですが、tagnoを複数指定するのにはどのようにしたらよいのでしょうか・・・。

select table from group by id having tag_no = 5 and tag_no = 9; として、

idの1と2を取り出す・・・といったことをやりたいのですが、
実際にやってみるとempty setとなります。

このテーブルで無理ならテーブルの変更もありなのですが、
一晩悩んでも思い浮かばず・・・。

mysqlはvar5.5です。

お力添えをよろしくお願い申し上げます。

投稿日時 - 2011-10-23 07:35:43

QNo.7088801

困ってます

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

> tag_noの5と9の両方を持つid(例に挙げたテーブルでいうと、1と2)のみを摘出したいのです。

とりあえず以下のSQLで上記の要件を満たせます。
(1と2ではなく1と3が抽出されますが)

select t1.id from
(select id from テーブル where tag_no = '5') as t1,
(select id from テーブル where tag_no = '9') as t2
where t1.id = t2.id


この要件でなぜgroup by とかhavingが出てくるのかわかりませんので
何か違うのかもしれませんが。

>グループのレコードに対する条件付けを認識しないようなのです。

ここを読む限り「group by」「having」に対する基礎的な理解が間違っているように思えます。「group by」「having」とは何か、どういうときに使うものなのかをもう少し勉強されたほうがいいと思います。

投稿日時 - 2011-10-23 12:16:23

お礼

なるほど・・・
「group by」「having」について、もう一度勉強してきます。

恥ずかしながら、書いていただいたクエリのような書き方を初めて見ましたので、新たな気づきになりました。

貴重な知識を、ありがとうございます。m(_ _)m

投稿日時 - 2011-10-24 03:33:23

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

CASE 式を使えば、HAVING 句だけでも「tag_noの5と9の両方を持つid」という条件をいちおう表現できますね。

例) -------------------------------------
SELECT id FROM テーブル GROUP BY id
HAVING
SUM(CASE tag_no WHEN 5 THEN 1 ELSE 0 END) >= 1 AND
SUM(CASE tag_no WHEN 9 THEN 1 ELSE 0 END) >= 1
-----------------------------------------

参考URL:http://codezine.jp/article/detail/405?p=2

投稿日時 - 2011-10-23 14:18:45

お礼

こんな書き方もあるんですか・・・!

ひとつひとつ検証させていただき、漏れなく活用させていただきます。
ご回答、ありがとうございました。m(_ _)m

投稿日時 - 2011-10-24 03:44:51

ANo.4

>tag_noの5と9の両方を持つid(例に挙げたテーブルでいうと、1と2)のみを摘出

おっと、そうでしたか。
self joinしてみるとか思いついたけど、No.2さんのクエリのほうが効率的みたい。

投稿日時 - 2011-10-23 12:16:49

お礼

ご丁寧に返答くださり、ありがとうございます。
ご提示頂きました知識は漏れなく勉強させて頂きます。m(_ _)m

投稿日時 - 2011-10-24 03:26:32

ANo.2

select id
from hoge
where tag_no in(5,9)
group by id
having count(distinct tag_no)=2

投稿日時 - 2011-10-23 12:08:01

お礼

びしっと出ました!

条件に合致した数を条件にする・・・思いつきませんでした。

ありがとうございますm(_ _)m

投稿日時 - 2011-10-24 03:28:47

ANo.1

> tag_no = 5 and tag_no = 9

andでなくorかと。

投稿日時 - 2011-10-23 09:47:29

補足

質問が分かりにくくかったようで、もうしわけありません。

tag_noの5と9の両方を持つid(例に挙げたテーブルでいうと、1と2)のみを摘出したいのです。

また、mysqlの仕様かもしれませんが、

group by skuno とすると、グループを対象とした処理(countなど)は出来るのですが、
グループのレコードに対する条件付けを認識しないようなのです。

投稿日時 - 2011-10-23 10:02:47