我想检索一个有序的查询结果,但是我需要在列表的前面有一些特定的行。类似于“堆栈溢出”中的内容,在答案列表中,正确的答案始终是第一个答案。
假设我需要将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解决方案都感兴趣。)
您的第一个例子对我来说差不多了。
SELECT * FROM foo ORDER BY id IN (1,2,3) DESC, created_date ASC
添加DESC是因为id IN (1,2,3)返回1true或0false。1 > 0,因此按降序对其进行排序可得到理想的结果。
DESC
id IN (1,2,3)
1
0
1 > 0
添加ASC是因为我喜欢明确。
ASC
根据后面的示例,我认为您缺少的是尽管它包含空格,但是它field IN (list)是返回0或的单个运算符1。IF(id IN (1,2,3), 0, 1)本质上是多余的。
field IN (list)
IF(id IN (1,2,3), 0, 1)
因此,您不需要手动使用aUNION 或 sort,因为MySQL使此操作比您甚至意识到的还简单:)
UNION