2

私は次の表を持っています:

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

4

4 に答える 4

5

私はあなたが欲しいものは次のとおりだと信じています:

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

これは、更新日(利用可能な場合)または作成日(利用できない場合)のいずれかで注文します。次に、IDの降順で並べ替えます。

于 2013-03-19T14:02:07.597 に答える
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
于 2013-03-19T13:51:34.277 に答える
0

おそらく試してみてくださいCOALESCE

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

これは必ずしもあなたが求めていたものとは限りませんが、あなたが望む方向に進んでいる可能性がありますそれが正しくない場合、あなたはあなたが望むものの例を投稿できますか?

于 2013-03-19T13:51:23.693 に答える
0

私はあなたが何を望んでいるかを正確に理解していませんが、あなたはこれを試すことができます:

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

これらの日付のいずれかが使用可能な場合、結果は日付で並べ替えられます。利用可能な日付がない場合、結果はIDでソートされます。

注:IFNULLは必ずしもDBMSで使用できるとは限りませんが、同等のものを見つけることができます。

于 2013-03-19T13:54:20.243 に答える