admin

ORDER BY条件

sql

我想检索一个有序的查询结果,但是我需要在列表的前面有一些特定的行。类似于“堆栈溢出”中的内容,在答案列表中,正确的答案始终是第一个答案。

假设我需要将ID为1,2,3的行作为标题,其余按日期字段排序,是否可以执行以下操作:

SELECT * FROM foo ORDER BY id IN (1,2,3), created_date

如果没有,哪个更有效率?将有很多行!

SELECT *, 0 AS head FROM foo WHERE id IN (1,2,3) 
UNION
SELECT *, 1 AS head FROM foo WHERE id NOT IN (1,2,3)
ORDER BY head, created_date

或者

SELECT *, IF(id IN (1,2,3), 0, 1) AS head
ORDER BY head, created_date

(我现在使用MySQL,但是我对其他任何SQL解决方案都感兴趣。)


阅读 296

收藏
2021-07-01

共1个答案

admin

您的第一个例子对我来说差不多了。

SELECT * FROM foo ORDER BY id IN (1,2,3) DESC, created_date ASC

添加DESC是因为id IN (1,2,3)返回1true或0false。1 > 0,因此按降序对其进行排序可得到理想的结果。

添加ASC是因为我喜欢明确。

根据后面的示例,我认为您缺少的是尽管它包含空格,但是它field IN (list)是返回0或的单个运算符1IF(id IN (1,2,3), 0, 1)本质上是多余的。

因此,您不需要手动使用aUNION sort,因为MySQL使此操作比您甚至意识到的还简单:)

2021-07-01