2012-01-27 41 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的文档,它说后“作为一般规则,你不应该赋值给一个用户变量和相同的语句中读出的值” 。

任何帮助将不胜感激。

编辑

我尝试连接,并与左JOINS不会起作用,因为查询可能不会返回任何结果。使用FULL OUTER JOIN仿真只需要很长时间。 (在〜5000行的桌子上测试)

回答

1

为什么不只是做工会......是的,它可能会更长一点,但应该更有效率。你的查询是从tbl1查询的,不仅仅是在哪里,而是在哪里,以及在现场条件下。选择标准每一次选择和工会一旦与条件

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个不同的标准/套/订单,如果我不想加入“东西”给ColumnX如果查询结果这将工作。 CASE当query1那么“某事”什么时候query2那么“somethingElse”。 – Andrew 2012-01-27 13:29:02