Оптимизируйте повторное использование подзапроса MySql - PullRequest
0 голосов
/ 27 января 2012

У меня есть этот запрос, который делает то, что мне нужно, но я чувствую, что могу немного его улучшить, но не знаю, как.

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

Я пытался с JOINS, и с LEFT JOINS не будет работать, потому что запросы могут не дать никаких результатов. С эмуляцией FULL OUTER JOIN это займет слишком много времени. (Проверено на таблице с ~ 5000 строками)

1 Ответ

1 голос
/ 27 января 2012

почему бы просто не делать союзы ... да, это может быть немного дольше, но ДОЛЖНО быть более эффективным.Ваш запрос запрашивается из tbl1 не только в положении «где», но и в состоянии «где», и снова в условии «поле».Выберите критерии ОДИН РАЗ в ВЫБРАТЬ ОДИН РАЗ и объедините их со всеми 5 различными критериями / наборами / заказами по условиям

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...