[英]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.