[英]ORDER BY condition
我想检索一个有序的查询结果,但是我需要在列表的前面有一些特定的行。 类似于“堆栈溢出”中的内容,在答案列表中,正确的答案始终是第一个答案。
假设我需要将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解决方案都感兴趣。)
UNION表示UNION DISTINCT,这相对较慢,因为即使没有重复,它也会检查重复项。 您想要UNION ALL:
SELECT *, 0 AS head FROM foo WHERE id IN (1,2,3)
UNION ALL
SELECT *, 1 AS head FROM foo WHERE id NOT IN (1,2,3)
ORDER BY head, created_date
我可以想象,在进行此更改之后,这三个查询之间的性能没有太大差异。 最好的确定方法是测量它。
您的第一个例子对我来说差不多。
SELECT * FROM foo ORDER BY id IN (1,2,3) DESC, created_date ASC
添加了DESC
因为id IN (1,2,3)
如果为true,则返回1
0
如果为false,则返回0
。 1 > 0
,因此按降序对其进行排序可获得所需的结果。
添加了ASC
因为我喜欢明确。
根据后面的示例,我认为您缺少的是,尽管field IN (list)
包含空格,但它是返回0
或1
的单个运算符。 IF(id IN (1,2,3), 0, 1)
本质上是冗余的。
因此,您不需要使用UNION
或手动排序,因为MySQL使此操作比您甚至意识到的还要简单:)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.