2011-12-21 11 views
21

このようなmysqlクエリを実行することは可能ですか?mysqlサブクエリの結果は "where"句

select (select A from B where ...) as C from D where C like ' ... ' 

サブクエリの結果を一般的な「where」節で使用する必要があります。

答えて

27

をあなたは、このようなサブクエリでそれをラップすることができます:

SELECT * 
FROM (
     select (select A from B where ...) as C from D 
    ) subq 
WHERE 
    C like ' ... ' 
+1

1あなたは、私は、これは動作するはずだと思うが、私は私が私の目的には使用しないことができると思い –

+0

...私の前に終えました。私はちょうど。はい、あなたがこれを使用することができ、フィールド1を選択する「のようなもの、FIELD2、FIELD3としてSQL3、FIELD4、フィールド2 = 『...』、フィールド5 =テーブルからフィールド5としてsql5 『...』 – Eddie

+0

@Eddieを作成する必要がありますサブクエリの派生フィールドを使用するwhere句の部分を外側のwhere句に移動します。 –

7

あなたはこれを読んでいますか?

http://dev.mysql.com/doc/refman/5.0/en/subqueries.html

サブクエリは、別のステートメント内のSELECT文です。

MySQL 4.1からは、 がMySQL固有のいくつかの機能と同様に、SQL標準で要求されるすべてのサブクエリ形式と操作がサポートされています。

ここ

サブクエリの例を次に示します。この例では

SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2); 

、SELECT * T1から...外側のクエリ(または外側のステートメント)で、 と(COLUMN1を選択FROM t2)がサブクエリです。サブクエリ は外部クエリ内でネストされており、実際には他のサブクエリ内のサブクエリをかなりの深さまでネストすることができます。 サブクエリは常に括弧内に表示する必要があります。サブクエリの

主な利点は以下のとおりです。

彼らはそれが可能であるように に構成されているクエリは、ステートメントの各部分を分離することができます。

これらは、 が複雑な結合や共用体を必要とする操作を実行する代替方法を提供します。

多くの人が、複雑な結合または の結合よりも読みやすいサブクエリを見つけます。確かに、それはここで、「構造化照会 言語」

人 に早くSQLを呼び出すのオリジナルのアイデアを与えたサブクエリの革新だったSQLで指定され 副問合せの構文についての主要なポイントを示した例文です標準と のMySQLでサポート:

1

はありません示されていないよう。両方の場所でクエリを実行することができます。またはあなたがどこにサブクエリの結果を比較する意味場合は、[はい、あなたがこれを行うことができ、それらの結果を一時テーブルを作成し、

Select C from D inner join (Select A from B where...) C on C.1=D.1 where C like....

+0

私はそれは良いアイデアではありませんが、それは私の目的のために最善の解決策であることを、私は知っているそう...最も簡単な方法) – Eddie

0

...クエリが利用できるようにそれらを結合。しかし

select X ... where (select Y ...) = Z

、おそらく悪いアイデア。一般的には、これを行う必要があるときは、それをメインセレクトに合理化する方法を探すのが最善です。ネストされたクエリを避けるための非常に創造的な方法があります。その理由のビーイングは、すべての選択はあなたがサブクエリに対してどこに行っ意味する場合は、あなただけのすべてを選択し、場所を適用するたびに

を内側のクエリを実行しなければならないことです。しかし、もう一度、別の場所に適用することもできます。

select X ... where Y = Z and A = B.

+0

、両方の場所でクエリを実行していることについて考え。答えをありがとう。 – Eddie

+0

@Eddie私はそれが最良の解決策と思われることを理解します。入れ子にしなければならないクエリの例を見ることができますか?それで、それが再加工できるかどうかわかりますか?ネストされたものはO(n)であり、それは不可能な厄介なものになります。ネストされたクエリが毎回同じ結果を生成する場合、ネストしたものを使用する必要は全くありません。 –

+0

は、私がフィールド1を選択する「のようなもの、FIELD2、FIELD3としてSQL3、FIELD4、フィールド2 =テーブルからフィールド5としてsql5 『...』、フィールド5 = 『...』 – Eddie

2

これは実際には有効なSQLですが:

SELECT D.A 
FROM D 
INNER JOIN B ON B.A = D.A 
+0

)のいずれかの条件が有効である。*私はサブクエリの必要性が表示されない*もちろんの – Eddie

0

これは常に良いです:

select (select A from B where A = D.A) as C 
from D 

あなたはより良いオフ(性能面)の代わりに、JOINを実装していますサブクエリーの代わりにテーブルを結合する すなわち サブクエリ:

SELECT id, (SELECT abc FROM t2 WHERE ID = user_id) as user_name FROM t1 

は参加:

SELECT c.id,u.abc FROM t1 as c LEFT JOIN t2 AS u ON u.ID = c.user_id WHERE 1=1 AND u.`user_login` = 'qwe123' 

我々はサブクエリでwhere句を置くしようとした場合、それはエラーをスローします。

関連する問題