MySQL Orderby число, пустые строки (или 0) Последний - PullRequest
7 голосов
/ 12 января 2010

Только что задал вопрос, очень похожий на этот ...

В настоящее время я делаю очень простой OrderBy в своем заявлении.

SELECT * FROM tablename WHERE visible=1 ORDER BY position ASC, id DESC

Проблема в том, что пустые строковые записи для 'position' обрабатываются как 0. Поэтому все записи с позицией в виде пустой строки появляются перед записями с 1,2,3,4. например:

'', '', '', 1, 2, 3, 4

или

0, 0, 0, 1, 2, 3, 4

Есть ли способ добиться следующего заказа:

1, 2, 3, 4, '', '', ''.

или

1, 2, 3, 4, 0, 0, 0.

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

Ответы [ 4 ]

15 голосов
/ 12 января 2010
SELECT * 
FROM tablename 
WHERE visible=1 
ORDER BY 
    case when position in('', '0') then 1 else 0 end,
    position ASC, 
    id DESC
1 голос
/ 13 января 2010

Вы говорите, что position содержит пустые строковые записи ... Вы действительно имеете в виду пустую строку или NULL? Если на самом деле он содержит NULL записей, вы должны использовать небольшое изменение выражения Орбмана:

SELECT * 
FROM tablename 
WHERE visible=1 
ORDER BY 
    COALESCE(position, ~0)
,   id DESC

COALESCE() возвращает значение первого аргумента, NOT NULL. ~ 0 - это кусок черной магии, который даст вам максимальное целочисленное значение, поддерживаемое MySQL. (~ делает побитовое отрицание, превращая все 0 бит в 1). Таким образом, в этом случае, если position IS NULL истинно, он вернет 18446744073709551615, иначе он вернет значение position.

Я также хотел бы отметить, что тип данных вашего столбца position, скорее всего, должен быть целочисленного типа (см. http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html).. Поскольку вы упоминаете пустые строки, я думаю, что вы должны проверить свою таблицу определение путем выполнения SHOW CREATE TABLE <tablename>. Если позиция не является целочисленным типом, я бы посоветовал вам изменить его. Основная причина в том, что строки, даже если они выглядят как числа, не сортируются как числа.

1 голос
/ 12 января 2010

Вы можете попробовать оператор CASE , например:

SELECT *
FROM tablename
WHERE visible = 1
ORDER BY CASE position WHEN '' THEN '9999' ELSE position END CASE ASC,
    ID DESC
0 голосов
/ 12 января 2010

вы можете попытаться объединить два подзапроса, где один выбирает id> 0 и не пуст, а другой выбирает пустой и только 0

...