MySQL выбрать из выбора?

0

У меня возникают проблемы с 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%, и он никогда не завершается. Даже объясняя перед выбором, запрос никогда не возвращается.

Любое предложение или указатели будут очень благодарны!

Спасибо, Дуг

  • 0
    Как долго вы дали это? Что-нибудь еще изменилось, кроме вашей версии? Размер? Данные?
Теги:

2 ответа

1

Я нашел режим профилирования MySQL таким же полезным, как EXPLAIN. Вы можете включить его перед запуском своего запроса, а затем сбросить тайминги для каждого шага. Это действительно удобный способ оптимизации подзапросов - вы можете заметить, что ваш подзапрос выполняется для каждой строки в предложении SELECT, когда он может выполнять одно время как предложение WHERE.

  • 0
    Спасибо, Джефф, это очень удобно. Объяснить это хорошо, но это только дает вам и "идею", как много времени займет. Я попробую!
1

Вот как я бы написал этот запрос:

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
  • 0
    Билл, спасибо за отзыв, я приму твое предложение, адаптирую к нему свой фактический запрос и проведу некоторое тестирование с ним. Еще раз спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню