2016-05-17 6 views
0

私は動的クエリを含む変数を持っています。このような何か:JOIN句にSELECT文を使用する方法は?

$query = "SELECT id, subject FROM post1 
      UNION ALL 
      SELECT id, subject FROM post2 
      UNION ALL 
      SELECT id, subject FROM post3"; 

また、私はこのクエリを持っている:

SELECT code FROM mytable WHERE id = :id 

は今、私はその動的なクエリで上記joinクエリにしたいです。ここに私の試しです:

SELECT t1.code t2.subject FROM mytable t1 
    LEFT JOIN ($query) t2 ON t1.col = t2.id 
WHERE t1.id = :id 

/* 
SELECT t1.code t2.subject FROM mytable t1 
    LEFT JOIN (SELECT id, subject FROM post1 
       UNION ALL 
       SELECT id, subject FROM post2 
       UNION ALL 
       SELECT id, subject FROM post3) t2 ON t1.col = t2.id 
WHERE t1.id = :id 
*/ 

それは動作します。しかし、膨大なデータには多くの時間がかかります。どうすれば速くすることができますか?

答えて

1
SELECT t1.code t2.subject FROM mytable t1 
    LEFT JOIN (SELECT id, subject FROM post1 
       JOIN mytable tt1 ON tt1.col = post1.id AND tt1.id=:id 
       UNION ALL 
       SELECT id, subject FROM post2 
       JOIN mytable tt2 ON tt2.col = post2.id AND tt2.id=:id 
       UNION ALL 
       SELECT id, subject FROM post3 
       JOIN mytable tt3 ON tt3.col = post3.id AND tt3.id=:id) t2 ON t1.col = t2.id 
WHERE t1.id = :id 

選択したデータの量を制限するために:id checkを内部querie4stに追加するだけです。

+0

THXは........ 1 – Shafizadeh

+0

あなたは私の[このソリューション](http://stackoverflow.com/questions/37270024/how-to-use-aについてのあなたの意見を教えてください可能性があり-select-statement-into-join-clause#37271046)? – Shafizadeh

+0

また、私はサブクエリで 'id'を選択することは重複していると思いますか? – Shafizadeh

1

以下のクエリを使用できます。

SELECT t1.code, t2.subject FROM (SELECT code, col FROM mytable WHERE id = :id) t1 
LEFT JOIN ($query) t2 ON t1.col = t2.id 
+0

賢い..... +1 – Shafizadeh

+0

@ Shafizadehありがとう。これは呼び出されたクエリの最適化です。 –

+0

col select(select code、col FROM mytable WHERE id =:id)にする必要があります。しかし、とにかく内側のクエリ** t2 **はすべての行を取得しますが、それらはまったく必要ありません。 – StanislavL

関連する問題