У меня возникают проблемы с sql-запросом, здесь обобщение того, что я пытаюсь сделать:
select
oh.a as a,
oh.b as b,
oi.c as c,
(select h.d from history h where h.id = oh.id and h.d not in ('d1', 'd2') order by h.date limit 1) as d
from order_header oh
join order_item oi on oh.order_id = oi.order_id
where oh.state in (0, 10, 20)
Моя проблема в том, что этот тип запросов отлично работает в MySQL версии 5.0.77, но он не работает в MySQL версии 5.1.47. И по проблеме я имею в виду, когда запрос запускает MySQL, привязывает процессор к 100%, и он никогда не завершается. Даже объясняя перед выбором, запрос никогда не возвращается.
Любое предложение или указатели будут очень благодарны!
Спасибо, Дуг
Я нашел режим профилирования MySQL таким же полезным, как EXPLAIN. Вы можете включить его перед запуском своего запроса, а затем сбросить тайминги для каждого шага. Это действительно удобный способ оптимизации подзапросов - вы можете заметить, что ваш подзапрос выполняется для каждой строки в предложении SELECT, когда он может выполнять одно время как предложение WHERE.
Вот как я бы написал этот запрос:
select
oh.a as a,
oh.b as b,
oi.c as c,
h1.d as d
from order_header oh
join order_item oi on oh.order_id = oi.order_id
left outer join history h
on h.id = oh.id and h.d not in ('d1', 'd2')
left outer join history h2
on h2.id = oh.id and h2.d not in ('d1', 'd2')
and (h.date > h2.date or h.date = h2.date and h.id > h2.id)
where oh.state in (0, 10, 20) and h2.id is null