2012-03-20 32 views
3

mysqlサブクエリをサブクエリとして再度使用する場合は、どういうわけか保存できますか?おそらくこれは、より洗練されたコードを生成するだけでなく、解析のオーバーヘッドを節約するでしょう。次の外側で例えばmysqlサブクエリを変数に格納する

(SELECT * FROM t2 WHERE t2.foo=='bar')を繰り返さないようにいいだろう

SELECT * FROM t1 
LEFT JOIN (SELECT * FROM t2 WHERE t2.foo=='bar') ON t1.id = t2.id 
UNION 
SELECT * FROM t1 
RIGHT JOIN (SELECT * FROM t2 WHERE t2.foo=='bar') ON t1.id = t2.id 

に参加します。もちろん

+2

にあなたを'(SELECT * FROM t2 WHERE t2.foo == 'bar')'の代わりに 'ON t1.id = t2.idとt2.foo = 'bar''を使うことができます。 P.S mysql内で単一の '='のみを表示 – safarov

+0

ビューを使用する可能性もあります。 – haltabush

答えて

2

この

SET @condition := (SELECT * FROM t2 WHERE t2.foo=='bar'); 
SELECT * FROM t1 
LEFT JOIN (@condition) ON t1.id = t2.id 
UNION 
SELECT * FROM t1 
RIGHT JOIN (@condition) ON t1.id = t2.id 
+0

私が間違っている場合は私を修正してください。これは動作していないと思います。 – Roylee

3

いいえ、あなたはできないようにそれを行います。 MySQLはCTE(共通テーブル式)を持っていた場合、あなたはこれを使用することができます

WITH tmp AS 
    (SELECT * FROM t2 WHERE t2.foo = 'bar') 
SELECT * FROM t1 
    LEFT JOIN tmp ON t1.id = tmp.id 
UNION 
SELECT * FROM t1 
    RIGHT JOIN tmp ON t1.id = tmp.id 

MySQLはFULL JOINを持っていた場合、あなたはこの使用することができます(残念ながら、それはどちらかなかった!):

SELECT * FROM t1 
    FULL JOIN (SELECT * FROM t2 WHERE t2.foo = 'bar') tmp 
    ON t1.id = tmp.id 
関連する問題