2010-03-02 87 views
2

我想检索一个有序的查询结果,但我需要有一些特定的行在列表前面。像堆栈溢出这样的东西,在答案列表中,正确答案总是第一个。ORDER BY条件

认为我需要有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解决方案。)

回答

2

你的第一个例子几乎在我身边。

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

新增DESC因为id IN (1,2,3)返回1如果真或0如果假的。 1 > 0,所以按降序对它们进行排序可以得到理想的结果。

添加了ASC,因为我喜欢明确。

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

这样,你不应该需要一个手动排序UNION使用,因为MySQL的使得这个简单得多,你甚至知道:)

+0

我想我必须有一个字段名,只有一个字段名作为一个ORDER BY参数,困我 – sibidiba 2010-03-02 23:07:58

3

UNION意味着UNION DISTINCT,这是因为它会检查比较慢即使不存在任何副本。你想要联盟全部:

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 

我会想象,在这个变化之后,三个查询之间的性能没有太大的区别。确定的最好方法是衡量它。