MYSQL ORDER BY CASE 问题
在 MySQL 中,在 ORDER BY 子句中使用 CASE 语句允许您根据以下条件指定多个排序条件特殊条件。然而,当尝试对两个不同的时间戳列进行排序时,就好像它们是单个统一的时间戳一样,会出现挑战。
考虑提供的表结构:
------------------------------------------------------------------- | id_one | id_two | timestamp_one | timestamp_two | ------------------------------------------------------------------- | 27 | 35 | 09:30 | NULL | | 35 | 27 | NULL | 09:35 | | 27 | 35 | 09:34 | NULL | | 35 | 27 | NULL | 09:33 | -------------------------------------------------------------------
目标是对行进行排序按较早的时间戳,无论它是存储在 timestamp_one 还是 timestamp_two 列中。以下查询尝试使用 CASE 语句来实现此目的:
SELECT * FROM tablename WHERE id_one=27 OR id_two=27 ORDER BY CASE WHEN id_one=27 THEN timestamp_one END DESC, CASE WHEN id_two=27 THEN timestamp_two END DESC
虽然此查询成功对 id_one=27 的行进行正确排序,但它无法将时间戳合并为单个排序标准。
要解决此问题,可以按如下方式修改查询:
SELECT id_one, id_two, timestamp_one, timestamp_two FROM tablename WHERE id_one = 27 OR id_two = 27 ORDER BY CASE WHEN id_one=27 THEN timestamp_one WHEN id_two=27 THEN timestamp_two END DESC
通过使用单个 CASE 表达式而不是单独的 CASE 表达式对于每个条件的 CASE 语句,MySQL 将时间戳合并为单个排序标准。这可确保行按需要正确排序:
------------------------------------------------------------------- | id_one | id_two | timestamp_one | timestamp_two | ------------------------------------------------------------------- | 27 | 35 | 09:30 | NULL | | 35 | 27 | NULL | 09:33 | | 27 | 35 | 09:34 | NULL | | 35 | 27 | NULL | 09:35 | -------------------------------------------------------------------
以上是如何使用 MySQL CASE 语句从两列中按较早的时间戳排序?的详细内容。更多信息请关注PHP中文网其他相关文章!