• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:group by とhaving)

group byとhavingの使用方法とは?

このQ&Aのポイント
  • group byとhavingを使用して、条件に基づいてグループ化されたデータを抽出する方法について説明します。
  • テーブルのデータをidでグループ化し、指定したtag_noを持つidを抽出する方法について説明します。
  • tag_noを複数指定する場合は、having句を使用してtag_no = 5 and tag_no = 9という条件を指定しますが、この条件は常にfalseとなります。

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

  • ベストアンサー
  • pringlez
  • ベストアンサー率36% (598/1630)
回答No.3

> 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」とは何か、どういうときに使うものなのかをもう少し勉強されたほうがいいと思います。

psalm221
質問者

お礼

なるほど・・・ 「group by」「having」について、もう一度勉強してきます。 恥ずかしながら、書いていただいたクエリのような書き方を初めて見ましたので、新たな気づきになりました。 貴重な知識を、ありがとうございます。m(_ _)m

その他の回答 (4)

  • root139
  • ベストアンサー率60% (488/809)
回答No.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
psalm221
質問者

お礼

こんな書き方もあるんですか・・・! ひとつひとつ検証させていただき、漏れなく活用させていただきます。 ご回答、ありがとうございました。m(_ _)m

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.4

>tag_noの5と9の両方を持つid(例に挙げたテーブルでいうと、1と2)のみを摘出 おっと、そうでしたか。 self joinしてみるとか思いついたけど、No.2さんのクエリのほうが効率的みたい。

psalm221
質問者

お礼

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

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

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

psalm221
質問者

お礼

びしっと出ました! 条件に合致した数を条件にする・・・思いつきませんでした。 ありがとうございますm(_ _)m

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

> tag_no = 5 and tag_no = 9 andでなくorかと。

psalm221
質問者

補足

質問が分かりにくくかったようで、もうしわけありません。 tag_noの5と9の両方を持つid(例に挙げたテーブルでいうと、1と2)のみを摘出したいのです。 また、mysqlの仕様かもしれませんが、 group by skuno とすると、グループを対象とした処理(countなど)は出来るのですが、 グループのレコードに対する条件付けを認識しないようなのです。

関連するQ&A