簡體   English   中英

訂單條件

[英]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)包含空格,但它是返回01的單個運算符。 IF(id IN (1,2,3), 0, 1)本質上是冗余的。

因此,您不需要使用UNION 手動排序,因為MySQL使此操作比您甚至意識到的還要簡單:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM