2015-06-02 2 views
1

Во-первых, я прошу прощения за плохой заголовок вопроса, я не могу объяснить, в чем моя проблема, но я уверен, что опытный пользователь MySQL будет знать.Как отсортировать результаты MySQL по двум различным вариантам сортировки?

После запроса базы данных для извлечения определенного набора клиентов они первоначально сортируются по столбцу «завершено» со значениями «0» и «1».

Я бы хотел сортировать всех клиентов со значением «0» по дате поставки ASC и, все клиенты со значением «1» по дате поставки DESC.

Вот мой первый и только неудачная попытка:

mysql_query("SELECT * FROM users WHERE (completed='0' ORDER BY delivery ASC) AND (completed='1' ORDER BY delivery DESC)") or die(mysql_error()); 
+0

Что тип столбца 'delivery'? – axiac

ответ

4

Это может быть сделано с помощью case-when в предложении order by в

SELECT * FROM users 
order by 
case 
when completed='0' then delivery 
end, 
case 
when completed='1' then delivery 
end desc; 

Если вам нужно отправить все completed='0' на вершине поразумевается не имеет нулевых значений, то вы можете сделать это как

order by 
completed, 
case 
    when completed='0' then delivery 
end, 
case 
    when completed='1' then delivery 
end desc; 
+1

У вас одно и то же состояние дважды ... –

+1

Ah @AlexandreLavoie благодарит за это: –

+0

Это почти работает! Но он не показывает завершенные 0? –

1

Первое поле сортировки: completedASC -изменение, конечно.

Для второго поля вы можете использовать выражение, которое позволяет сортировать значения delivered. Предполагая, что тип столбца delivered равен DATE или DATETIME, UNIX_TIMESTAMP(delivered) - это номер.

completed = '0'UNIX_TIMESTAMP(delivered) в порядке возрастания. Для completed <> '0' с использованием отрицательного значения (- UNIX_TIMESTAMP(delivered)) также отсортировано ASC -изменяет порядок строк.

Это запрос:

SELECT * 
FROM users 
ORDER BY completed ASC, 
    CASE 
    WHEN completed = '0' THEN UNIX_TIMESTAMP(delivered)  # ASC-ending 
    ELSE      - UNIX_TIMESTAMP(delivered)  # DESC-ending 
    END ASC 
; 
+0

Интересная альтернатива, но я думаю, что ответ выше легче понять и использовать. –

+1

Действительно, это более понятно, и оно работает независимо от типа столбца 'deliver'. Шахта не работает для струн. – axiac