MySQLでクエリーを実行して複数の結果が抽出されるとします。

SELECT A FROM TABLE1 WHERE B=C;

結果
t1,t2,t3.........

この結果を用いて引き続きSQLを実行したいと思います。
SELECT x FROM TABLE2 WHERE (y = t1) OR (y = t2) OR (y = t3).......... ;


現在は上の結果を配列に入れてfunctionの中でクエリー文を作っていますが、そうしないで、SQLだけで行うスマートな方法はないでしょうか。

IN を使ったらエラーになり、うまくいきませんでした。また、副クエリーというのを少し調べてみましたが、1番目のクエリー結果が1行だけでないとエラーになるのだそうです。
良い方法をご存じの方、どうかよろしくお願いします。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2007/06/02 01:54:23
  • 終了:2007/06/02 17:14:54

回答(5件)

id:Mook No.1

Mook回答回数1312ベストアンサー獲得回数3912007/06/02 02:12:28

ポイント20pt

サブクエリ(副クエリ)でよいと思いますが、

SELECT X FROM TABLE2 WHERE Y IN ( SELECT A FROM TABLE1 WHERE B=C );

では、希望通りの結果にならなかったでしょうか。


http://dev.mysql.com/doc/refman/4.1/ja/row-subqueries.html

id:mouitchou

ありがとうございます。

下記のようにTABLE1を二回使っているのがいけないのでしょうか。

-------------------------------

SELECT DISTINCT `multi_division`.`emp_cd`

FROM `multi_division`

WHERE `multi_division`.`division`

IN (

SELECT DISTINCT `multi_division`.`division` FROM `multi_division` WHERE `multi_division`.`emp_cd` = '009'

)

------------------------

というのを使うと、Syntaxエラーになります。

個別のクエリーは正常に結果が出ます。

2007/06/02 15:38:09
id:t_shiono No.2

t_shiono回答回数256ベストアンサー獲得回数222007/06/02 02:36:38

ポイント20pt

期待した内容かどうか分かりませんが、以下のような記述はどうでしょうか?

SELECT TABLE2.x
FROM TABLE1
JOIN TABLE2 ON TABLE2.Y = TABLE1.A
WHERE B = C

詳しくは次のURLなどを確認してください。

http://dev.mysql.com/doc/refman/4.1/ja/join.html

id:mouitchou

ありがとうございます。

JOIN TABLE2 ON TABLE2.Y = TABLE1.A

とすると、いいのですね。

T1とT2には、同じ表を使って違う引き方をしたものでもよいのでしょうか。エイリアスが必要でしょうか。

2007/06/02 15:49:50
id:chuken_kenkou No.3

chuken_kenkou回答回数722ベストアンサー獲得回数542007/06/02 06:09:57

ポイント20pt

MySQLのバージョンは、4.1以降ですよね?


IN を使ったらエラーになり、うまくいきませんでした。

どういう記述をしたら、どういうエラーになったのか、具体的な内容は分かりませんか?


1番目のクエリー結果が1行だけでないとエラーになるのだそうです

サブクエリでは、以下のように=条件の場合は、2行以上ヒットすると、「結果が2行以上になる」というエラーになります。

select x
 from TABLE2
 where y=(select A from TABLE1 where B=C)

この場合は、inを使います。

select x
 from TABLE2
 where y in(select A from TABLE1 where B=C)

性能を重視するなら、MySQLはサブクエリ(副問い合わせ)でインデクスを有効利用してくれない場合があり、ジョインに書き直すことで性能改善を図れる場合があります。

MySQL AB :: MySQL 4.1 リファレンスマニュアル :: 6.4.2.11 初期の MySQL バージョンに合わせたサブクエリの書き換え

id:mouitchou

ありがとうございます。

Versionは、4.1以降です。

コード例は既に記載したのと同じですが、

SELECT DISTINCT `multi_division`.`emp_cd`

FROM `multi_division`

WHERE `multi_division`.`division`

IN (

SELECT DISTINCT `multi_division`.`division` FROM `multi_division` WHERE `multi_division`.`emp_cd` = '009'

)

と書くとSyntaxエラーになります。それぞれのクエリーはちゃんと作動します。

Joinは初めてになりますので、まずイメージからしてちょっと勉強しないといけないです。

2007/06/02 15:44:27
id:F-15X No.4

F-15X回答回数111ベストアンサー獲得回数132007/06/02 08:47:15

ポイント20pt

サブクエリだとこんな感じでしょうか。

SELECT x 
FROM TABLE2 
WHERE y IN (
    SELECT A FROM TABLE1 WHERE B=C
);

id:mouitchou

ありがとうございます。やはりこれが原則なのですね。

2007/06/02 15:45:16
id:chuken_kenkou No.5

chuken_kenkou回答回数722ベストアンサー獲得回数542007/06/02 16:26:11

ポイント20pt

貼り付けてもらったSQLを、MySQL 5.0で実行したら期待通り動きました。

SYNTAXエラーのメッセージで、エラー検知した付近の文字が出ますよね?どの辺で、引っ掛かってますか?

DISTINCTをGROUP BYに変え、インラインビューをジョインする形にしてみましたが、どうでしょうか?


MySQL AB :: MySQL 4.1 リファレンスマニュアル :: 6.4.2.8 FROM 節のサブクエリ


select x.`emp_cd`
 from `multi_division` as x
 inner join
 (select `division`
   from `multi_division`
   where `emp_cd`='009'
   group by `division`) as y
 on x.`division`=y.`division`
 group by `emp_cd`;
id:mouitchou

当方では動きません。やはりエラーになります。

どうもVersionを私が誤認識していたようです。phpinfoでMySQL Client API version 3.23.58 と出ています。

2007/06/02 16:56:04
  • id:mouitchou
    例に挙げたコードは、作成中途のテスト用のものです。本当は1番目・2番目の条件とも(multi_division.attribute='RW'OR multi_division.attribute='ROM')を追加したいと考えています(曖昧検索のように輪を拡げる)。でないと最初のemp_cdを検索することになりますから。
  • id:mouitchou
    同じテーブルなのがいけないのかと思いましたが、これでも同じエラーになります。根本的に考え方が間違っているのでしょうか……。
    なお、テスト実行はphpMyAdmin上で行っています。
    と、もしかしたら思っているよりMySQLのVersionが古いのかも知れないので調べ直してみます。(^^;

    ----------------------------------
    SELECT *
    FROM `employee`
    WHERE emp_cd
    IN (
    SELECT DISTINCT multi_division.emp_cd
    FROM multi_division
    WHERE multi_division.division = '1'
    )
    ----------------------------------
  • id:chuken_kenkou
    phpMyAdminからなら、SQLを入力できる状態で、

    select version();

    を実行したら、MySQLのバージョンを表示できます。
  • id:mouitchou
    version()
    3.23.58
    と出ます。
    http://dev.mysql.com/doc/refman/4.1/ja/rewriting-subqueries.html
    にチャレンジということですね。

  • id:mouitchou
    結局MySQLのバージョンが低いというがっかりな結論となりました。ちょっと考えを整理して仕切り直すことにします。皆さま有り難うございました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません