sql - ORDER BY 条件

标签 sql mysql performance query-optimization

我想检索有序查询结果,但我需要在列表前面有一些特定的行。就像 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/

相关文章:

mysql - 这真的是交叉连接吗?

mysql - 大查询 SQL 中其他列中 2 个提取列的总和

使用 100% 单 CPU 内核的 Java Web 应用程序

mysql - 如何删除所有外键约束?

python - 从数据库中提取数据然后将其传递给 qtreeview

sql - Postgresql 查询将列转置为行

mysql - rake 数据库 :create failing on Win7 x64

php - Codeigniter -> 提取更多数据

java - google app engine 花费太多时间从端点 android 给出响应

c - 在生产者/消费者多线程环境中优化共享缓冲区