dポイントプレゼントキャンペーン実施中!

指定した second_no しか存在しない no を抽出したいのですが、
どのように SQL 文を記述すればよいか分からなかったので、
記述方法についてアドバイスいただける方がいらっしゃいましたら、
ご教示の程、よろしくお願いします。

[test_table]テーブル
―――――――――
id|no|second_no
―――――――――
1 |11|01
2 |11|03
3 |11|05
4 |12|05
5 |13|00
6 |13|05
7 |14|00
8 |14|05
―――――――――

【やりたい事1】
下記のように second_no が 00 と 05 のものを抽出すると、no = 11, 12, 13, 13, 14, 14 が抽出されます。
SELECT *
FROM test_table
WHERE second_no = '00'
OR second_no = '05'

これを no = 13, 14が抽出され、no = 11, 12 は抽出されないようにしたいです
(no = 11 は、second_no に 01 という 00, 05 以外の値が存在する為です。
no = 12 は second_no に 00 が存在しない為です)。

その為、下記の方法で出来ないかと考えました。
1. 全件取得
2. 部分取得
3. 全件取得で獲得した no と部分取得で獲得した no の個数が一致したものが今回取得したいもの。

上記の考え方をソースにしたものは下記となりますが、
この考え方では、no = 12 が抽出されてしまうため、
考え方を変える必要があるのですが、どうすればよいか分かりませんでした。

なお、抽出したい second_no は 00 で抽出したいときもあれば、
00 と 05 で抽出したいときなど複数のパターンがあります。

それと、下記のソースの「データベースユーザ名」「データベースパスワード名」
「データベース名」はそれぞれの環境に合わせる必要があります。


【ソース】
<?php
$link = mysql_connect('localhost', 'データベースユーザ名', 'データベースパスワード名');
mysql_select_db('データベース名', $link);

// 1.全件取得
$query = mysql_query("SELECT * FROM test_table", $link);

while ($row = mysql_fetch_array($query)) {
// echo $row["no"];
// echo "<br>";
}
//echo "<br>";

// 2.部分一致。
$query = mysql_query("SELECT * FROM test_table WHERE second_no = '00' or second_no = '05'", $link);

while ($row = mysql_fetch_array($query)) {
// echo $row["no"];
// echo "<br>";
}

// 3.ここで1と2の結果を参考に、noが13と14を抽出したい。

mysql_close($link);
?>


【やりたい事2】
上記のソースは複数の SQL 文で実現しようとしていますが、
1つの SQL 文でこのような動作を実現する事は出来ないでしょうか?


以上、よろしくお願いします。

A 回答 (2件)

>組合せはユニークではなく、同じ値が存在しました。



じゃ、ちょっと工夫してこんな感じで?

SELECT *
FROM test_table
WHERE no IN(
SELECT no
FROM (SELECT DISTINCT no,second_no FROM test_table) AS SUB
GROUP BY no
HAVING count(second_no)=2 AND sum(IF(second_no IN ('00','05'),1,0))=2
)
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
ご教示いただいたSQL文で意図した動作になったと思います。

このたびはどうもありがとうございました。

お礼日時:2010/11/12 17:02

追加条件が必要、noとsecond_noの組合せはユニークであること


(つまりno=11にsecond_noが00であるものが2つないということ)

それであれば思い付きこんな感じで・・・
(もっと効率的なのもありそうですが)

SELECT *
FROM test_table
WHERE no IN(
SELECT no
FROM test_table
GROUP BY no
HAVING count(second_no)=2 AND sum(IF(second_no IN ('00','05'),1,0))=2
)
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
確認した所、no と second_no の組合せはユニークではなく、同じ値が存在しました。

なお、同じ値が存在しない場合、ご教示いただいた SQL 文で動作する事は確認しました。
SELECT no
FROM test_table
GROUP BY no
HAVING count(id) = 2
AND sum(IF(second_no IN ('00','05'),1,0)) = 2

それでこれは私のミスで大変申し訳ないのですが、
no と second_no の組合せはユニークで無い場合も、
【やりたい事1】の抽出ができる方法はないでしょうか?

それと【やりたい事2】の1つの SQL 文で実現する方法をご教示いただきありがとうございました。
出来ましたら、no と second_no の組合せはユニークで無い場合も1つの SQL 文で動作する方法をご教示いただけますと大変助かります。

以上、よろしくお願いします。

お礼日時:2010/11/12 15:58

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!