人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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行だけでないとエラーになるのだそうです。
良い方法をご存じの方、どうかよろしくお願いします。

●質問者: mouitchou
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:MySQL SELECT SQL T2 エラー
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● Mook
●20ポイント

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

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

◎質問者からの返答

ありがとうございます。

下記のように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エラーになります。

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


2 ● t_shiono
●20ポイント

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

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

◎質問者からの返答

ありがとうございます。

JOIN TABLE2 ON TABLE2.Y = TABLE1.A

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

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


3 ● chuken_kenkou
●20ポイント

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 バージョンに合わせたサブクエリの書き換え

◎質問者からの返答

ありがとうございます。

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は初めてになりますので、まずイメージからしてちょっと勉強しないといけないです。


4 ● F-15X
●20ポイント

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

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

◎質問者からの返答

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


5 ● chuken_kenkou
●20ポイント

貼り付けてもらった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`;
◎質問者からの返答

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ