- PR -

複数の条件を満たすSQL文

1
投稿者投稿内容
Ier
常連さん
会議室デビュー日: 2006/02/23
投稿数: 33
投稿日時: 2007-10-02 04:55
はじめましてIerと申します。
現在、MySQL4.0で以下のようなテーブルを作成しているのですが、

[Report]
rID | rName
------------
1 | name1
2 | name2

[Category]
cID | cName
------------
1 | cat1
2 | cat2

[reportCategory]
rID | cID
----------
1 | 1
1 | 2
2 | 1

[結合SQL]
SELECT *
FROM Report AS r INNER JOIN ReportCategory AS rc
 ON r.rID = rc.rID INNER JOIN Category AS c
  ON rc.cID = c.cID;

この状態から、cat1とcat2を含むReportを抽出したいと思っているのですが、
上手くいくSQL文が組めないでいます。
この場合はプログラムの方で対処する他ないのでしょうか?
shimix
ぬし
会議室デビュー日: 2004/08/05
投稿数: 512
お住まい・勤務地: 大分市
投稿日時: 2007-10-02 09:04
どういうことがしたいのかが把握出来ないのですが(私の読解力不足でしょうけど・・)こんな感じですかねぇ。

SELECT Report.*, Category.*
FROM (ReportCategory INNER JOIN Category ON ReportCategory.cID = Category.cID)
INNER JOIN Report ON ReportCategory.rID = Report.rID;

「こういう結果セットを得たい」というのを書いていただけるといいのですが・・。

∴ 外していたらごめんなさい。
Ier
常連さん
会議室デビュー日: 2006/02/23
投稿数: 33
投稿日時: 2007-10-02 10:53
shimixさん、返答ありがとうございます。
結合SQLを発行すると概ね

rID | rName | cID | cName
--------------------------
1 | name1 | 1 | cat1
1 | name1 | 2 | cat2
2 | name2 | 1 | cat1

という結果が得られると思うのですが、
ここから、cNameにcat1とcat2を持つrIDを抽出したいと思っています。

[欲しい結果]
rID | rName
------------
1 | name1

説明不足ですみませんでしたm(_ _)m
shimix
ぬし
会議室デビュー日: 2004/08/05
投稿数: 512
お住まい・勤務地: 大分市
投稿日時: 2007-10-02 11:28
あぁ、なるほど・・。未検証ですが、こんな感じですか?

select ReportCategory.rID, Report.rName
from (ReportCategory inner join Report on ReportCategory.rID = Report.rID)
inner join Category ON ReportCategory.cID = Category.cID
group by ReportCategory.rID, Report.rName
having (Sum(case cName when 'cat1' then 1 else 0)<>0) AND (Sum(case cName when 'cat2' then 1 else 0)<>0);

#手元のMS-Accessでテストしただけなので、相当に怪しいかも・・

[ メッセージ編集済み 編集者: shimix 編集日時 2007-10-02 11:32 ]
Ier
常連さん
会議室デビュー日: 2006/02/23
投稿数: 33
投稿日時: 2007-10-02 12:36
shimixさん、返答ありがとうございます。
MySQLでも期待通りの結果が返ってくることを確認しました。
本当に助かりました。ありがとうございましたm(_ _)m
1

スキルアップ/キャリアアップ(JOB@IT)