2013-03-19 2 views
0

У меня есть следующая таблица:Сортировать по `` updated_at` и created_at`, даже если они NULL

CREATE TABLE `entries` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(255) DEFAULT NULL, 
    `created_at` datetime DEFAULT NULL, 
    `updated_at` datetime DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; 

Я хочу, чтобы отсортировать записи по updated_at как и created_at.

Но любой из них может быть NULL.

Мой запрос:

SELECT * 
FROM `entries` 
ORDER BY `updated_at` DESC, `created_at` DESC, `id` DESC 

Но это поставит каждую запись, которая не была обновлена ​​в нижней части результатов.

В основном, они нуждаются в сортировке по доступной дате. И если нет доступных для сортировки по id.

ответ

3

Я считаю, что вы хотите:

ORDER BY coalesce(updated_at, created_at) DESC, id DESC 

Это заказы либо обновленная дата (если таковой имеется) или дата создания (если он не доступен). Затем он заказывает по убыванию имени.

+0

Протестировано, подтверждено и принято. Это самый простой и выполняет свою работу. –

0

Возможно попробовать COALESCE:

SELECT * 
FROM `entries` 
ORDER BY COALESCE(updated_at, created_at, id) DESC 

Это не обязательно точно то, что вы просили, но это, вероятно, попадая в нужном вам направлении. Если это не так, можете ли вы опубликовать пример того, что вы хотите?

+0

типы в coalesce должны быть одинаковыми, поэтому идентификатор не будет работать там. Тот же quandry сам, потому что coalesce казался правильным для этого, за исключением разницы типов id. Мысли? Может быть, преобразовать его? –

+0

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

1

Вы можете использовать оператор CASE.

SELECT * 
FROM `entries` 
ORDER BY CASE WHEN `updated_at` IS NOT NULL then `updated_at` WHEN `created_at` IS NOT NULL then `created_at` ELSE `id` END DESC 
0

Я не совсем понимаю, что вы хотите, но вы можете попробовать это:

SELECT * 
FROM `entries` 
ORDER BY IFNULL(`updated_at`,`created_at`) DESC, `id` DESC 

Если один из этих дат можно, результаты будут отсортированы по дате. Если дата не доступна, результат будет отсортирован по id.

Примечание: IFNULL не обязательно доступен в вашей СУБД, но вы можете найти эквивалент.

+0

Если как 'updated_at', так и' created_at' для некоторых записей 'NULL', они будут помещены поверх остальных, а затем отсортированы по' id'. Я думаю, он будет работать с 'ORDER BY IFNULL (updated_at, IFNULL (created_at, id)) DESC' –

Смежные вопросы