我想检索有序查询结果,但我需要在列表前面有一些特定的行。就像 Stack Overflow 上的情况一样,在答案列表中,正确答案始终是第一个。
假设我需要将 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
我想,经过此更改后,三个查询之间的性能不会有太大差异。最好的确定方法是测量它。
关于sql - ORDER BY 条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2367457/