2016-07-30 211 views
0

這將是這樣的:如何通過特定訂單訂購?

SELECT * FROM users ORDER BY id ORDER("abc","ghk","pqr"...); 

在我的訂單條款可能有1000條記錄,並全部是動態的。

快速谷歌搜索給了我下面的結果:

SELECT * FROM users ORDER BY case id 
when "abc" then 1 
when "ghk" then 2 
when "pqr" then 3 end; 

正如我所說的一切我的訂單子句值是動態的。那麼對我有什麼建議嗎?

+1

把那些值的表,如果他們不已經。加入反對並通過它訂購。 –

+1

你能描述一下訂購的標準嗎? 「我的訂單條款值是動態的」是什麼意思?示例數據和預期結果會很好 – Philipp

+0

您的示例沒有幫助,因爲它仍然按升序排列的字母順序排列,因此您不需要定義「CASE」語句。這是_dynamic_按列存儲在查詢表中的數據的順序嗎?這聽起來可能像你需要分區和排名,但直到你提供更多的細節,包括預期的結果,我們無法提供幫助。 –

回答

1

您的示例並不完全清楚,因爲看起來簡單的ORDER BY就足以按字母順序排列您的ID。但是,似乎您正在嘗試創建可能不是按字母順序排列的動態排序方案。在這種情況下,我的建議是使用查找表來查找您將要排序的值。這有兩個目的:第一,它允許您輕鬆地重新排列項目,而無需更改表中的每個條目,其次,它避免(或者至少減少)錯字和其他「魔術串」可能發生的問題。

這看起來是這樣的:

查找表:

CREATE TABLE LookupValues (
    Id CHAR(3) PRIMARY KEY, 
    Order INT 
); 

查詢:

SELECT 
    u.* 
FROM 
    users u 
    INNER JOIN 
    LookupTable l 
    ON 
     u.Id = l.Id 
ORDER BY 
    l.Order 
+0

感謝您快速回復Brett。我需要一個類似下面查詢的查詢: 從user_group中選擇* from user order by master_group order by 1,2 DESC,3); 其中用戶表包含master_group表的user_group字段。 – Chinmay