2012-01-27 4 views
-1

私はこのクエリを必要とするが、私は少し改善することができると思うが、私は確信が持てない。MySqlサブクエリの再利用を最適化する

 
SELECT * 
    (CASE WHEN (SELECT f1 FROM tbl1 WHERE cond1 ORDER BY o1 LIMIT 1) then 'something0' 
      WHEN (SELECT f1 FROM tbl1 WHERE cond2 ORDER BY o2 LIMIT 1) then 'something1' 
      WHEN (SELECT f1 FROM tbl1 WHERE cond3 ORDER BY o3 LIMIT 1) then 'something2' 
      WHEN (SELECT f1 FROM tbl1 WHERE cond4 ORDER BY o4 LIMIT 1) then 'something3' 
      WHEN (SELECT f1 FROM tbl1 WHERE cond5 ORDER BY o5 LIMIT 1) then 'something4' 
     END) as columnX 
     FROM tbl1 
     WHERE another_cond1 AND f1 = (SELECT f1 FROM tbl1 WHERE cond1 ORDER BY o1 LIMIT 1) 
     OR another_cond2 AND f1 = (SELECT f1 FROM tbl1 WHERE cond2 ORDER BY o2 LIMIT 1) 
     OR another_cond3 AND f1 = (SELECT f1 FROM tbl1 WHERE cond3 ORDER BY o3 LIMIT 1) 
     OR another_cond4 AND f1 = (SELECT f1 FROM tbl1 WHERE cond4 ORDER BY o4 LIMIT 1) 
     OR another_cond5 AND f1 = (SELECT f1 FROM tbl1 WHERE cond5 ORDER BY o5 LIMIT 1) 

私は変数を使用しようとしたが、あまり成功せず、特に言うMySQLのドキュメント、読んだ後に「一般的なルールとしては、ユーザー変数に値を代入することはありませんし、同じ文の中で値を読みます」 。

ご協力いただければ幸いです。

EDIT

私が加入してみました、そしてLEFTと、クエリは結果を返していない可能性があるため動作しませんJOINS。 FULL OUTER JOINエミュレーションでは、時間がかかりすぎます。 (〜5000行のテーブルでテストされています)

答えて

1

なぜユニオンをしないのですか...はい、少し長めかもしれませんが、より効率的でなければなりません。クエリは、where、where、where、およびfield条件の中だけでなく、tbl1からもクエリを実行しています。クエリが結果を持っている場合、私はCOLUMNXに「何か」を追加したくなかった場合はうまくいく条件

select f1 as ColumnX 
    from tbl1 
    where another_cond1 and cond1 
    order by o1 
    limit 1 
UNION ALL 
select f1 as ColumnX 
    from tbl1 
    where another_cond2 and cond2 
    order by o2 
    limit 1 
UNION ALL 
select f1 as ColumnX 
    from tbl1 
    where another_cond3 and cond3 
    order by o3 
    limit 1 
UNION ALL 
select f1 as ColumnX 
    from tbl1 
    where another_cond4 and cond4 
    order by o4 
    limit 1 
UNION ALL 
select f1 as ColumnX 
    from tbl1 
    where another_cond5 and cond5 
    order by o5 
    limit 1 
+0

することにより、すべての5の異なる基準/セット/オーダーでONCE ONCEと組合そのSELECTあたりの基準を選択。ケース1の場合はクエリー1の場合は「何か」の場合クエリー2の場合は「何か」。 – Andrew

関連する問題