2014-10-03 2 views
0

мы имеем таблицу в следующем, который содержит статус заказа:Выберите максимум групп

history 
--------------------------------- 
order_id status date 
    25   1  2014-10-01 
    25   3  2014-10-02 
    26   1  2014-10-01 
    27   2  2014-10-01 
    26   4  2014-10-03 

мне нужно выбрать ORDER_ID столбцов с определенным статусом, но он должен быть последним статус. Это возможно с группой по специальности:

SELECT status, order_id, MAX(date) 
FROM history GROUP BY order_id HAVING status = 4 OR status = 2 

Но это не подходит для меня, потому что я только хочу ORDER_ID, потому что это является частью подзапроса (SELECT ... WHERE order_id IN ([ выше запроса])). Однако MySQL этого не позволяет. Есть ли альтернативный способ решить эту проблему?

+0

насчет 'GROUP BY (состояние)' и использовать 'WHERE' вместо' HAVING' – diEcho

+0

недавно один будет иметь большее автоматическое приращение столбец ID, вы может пойти с этой логикой – diEcho

+0

Учитывая, что этот вопрос задан и (правильно) ответил КАЖДЫЙ. ОДИН. ДЕНЬ. в SO я нахожу это немного удручающим, что а) его нужно еще раз спросить, и б), что многие респонденты могут дать неверные ответы. Я чувствую, что есть возможности улучшить механику SO в этом отношении. – Strawberry

ответ

-1

использование автообъединение

SELECT h1.`order_id` FROM `history` h1 
LEFT JOIN `history` h2 
ON (h1.`order_id`= h2.`order_id` AND h1.`status` > h2.`status`) 
-- WHERE h1.status IN (1,2,3) < -- here you can use your status condition 
GROUP BY h1.`order_id` 

Reference

+0

почему проголосовали! Я проверил запрос и хорошо работал. – diEcho

+0

Я проголосовал. Ваше решение ошибочно, и таким образом вернет непредсказуемые и ошибочные результаты. При одном исключении («хаке») это всегда происходит, когда GROUP BY используется при отсутствии каких-либо агрегационных функций. См. Мой комментарий выше - хотя ссылка, которую вы предоставляете (для другой СУРБД), также объясняет это! – Strawberry

+0

@Strawberry Я проверил это решение на своем конце и работал очень хорошо, OP хочет один выбор, и thats - единственное решение, которое я придумал. скажите мне, какая именно проблема? вы запустили это? – diEcho

0

Этой проблема является вариация стандартной задачи групповых макс, широко обсуждается здесь и в других местах - и даже со своей собственной отдельной главой в руководстве по MySQL.

Стандартный ответ на стандартной задачей является применение нескоррелированого подзапроса, следующим образом ...

SELECT x.* 
    FROM history x 
    JOIN 
    (SELECT order_id, MAX(date) max_date FROM history GROUP BY order_id) y 
    ON y.order_id = x.order_id 
    AND y.max_date = x.date; 

Ваша задача оказывается более сложным из-за дополнительных требований. Однако это красная сельдь. Правильный ответ, используя этот метод, то есть, как следует ...

SELECT x.* 
    FROM history x 
    JOIN 
    (SELECT order_id, MAX(date) max_date FROM history GROUP BY order_id) y 
    ON y.order_id = x.order_id 
    AND y.max_date = x.date 
WHERE status IN (2,4); 
Смежные вопросы