2011-06-07 86 views
3

我混淆了奇怪的MySQL查詢行爲。我旁邊MySQL查詢:Mysql的ORDER BY或MAX()幾個表字段排序?

SELECT 'username','status', 'field_1', 'field_2', 'field_3', 'field_4', 
    FROM my_table 
    ORDER by field_1 DESC, field_2 DESC, field_3 DESC, field_4 DESC 
    LIMIT 0,10 

通過的想法,它在視場多少個值在ORDER BY條件下降法訂購10行。但結果我獲得下一個:

凱特103
皮特101
史蒂夫102

,而不是

凱特103
史蒂夫102
皮特101

有誰知道爲什麼它設置不正確的順序?以及如何做出正確的ORDER BY DESC條件?

是否可以在幾個字段中使用MAX()?如果是的話,也許有可能像這樣組織MySQL查詢?

SELECT 'username','status', 'field_1', 'field_2', 'field_3', 'field_4', MAX(field_1,field_2,field_3,field_4) AS total 
    FROM my_table 
    ORDER by total DESC 
    LIMIT 0,10 
+0

你的問題是沒有意義的。如果在選擇中只有兩列(兩者均不包含「字段」,BTW),則無法按字段_1,字段_2,字段_3和字段_4進行排序。如果你需要幫助你的查詢,發佈更實際的SQL來展示你的問題。 – 2011-06-07 19:55:14

+0

@KenWhite對不起!忘了提及我已經選擇了字段排序。很匆忙,這就是爲什麼忘了把它們指向SELECT字段的原因。 – ilnur777 2011-06-07 21:06:54

回答

11

不能使用MAX()因爲函數返回一個在許多行的最大價值。但是你可以使用MySQL的GREATEST()函數。這返回其最大的參數,這些參數都來自一行。

SELECT `username`, `status`, GREATEST(field_1,field_2,field_3,field_4) AS field_greatest 
FROM my_table 
ORDER BY field_greatest DESC 
LIMIT 0,10 

但我也評論說,你已經通過存儲多列,應該是相同的數據「種」違反1st Normal Form。這被稱爲重複組。結果是你面對這個麻煩的問題。當您添加第五個字段時,您還需要重寫所有查詢。

取而代之,創建第二個表並將所有「字段」存儲在單個列中,並對用戶進行引用。然後,你可以加入表:

SELECT t.username, t.status, f.field 
FROM my_table AS t 
LEFT OUTER JOIN (SELECT username, MAX(field) AS field FROM my_fields GROUP BY username) AS f 
    ON t.username = f.username 
ORDER BY f.field DESC 
LIMIT 0,10 

還是我最喜歡的獲取排每組最大價值的方式:

SELECT t.username, t.status, f1.field 
FROM my_table AS t 
JOIN my_fields AS f1 ON t.username = f1.username 
LEFT OUTER JOIN my_fields AS f2 ON t.username = f2.username AND f1.field < f2.field 
WHERE f2.username IS NULL 
ORDER BY f1.field DESC 
LIMIT 0,10 
+0

感謝您的幫助!GREATEST()函數非常適合這種情況並且工作得很快。這是我需要的。 =) – ilnur777 2011-06-11 14:01:30

0

您無法將多個值輸入最大值。雖然你可以做一些嵌套的IF()的。

SELECT `username`,`status`, 
MAX(
    if(field_1 > field_2 and field_1 > field_3 and field_1 > field_4 ,field_1, 
    if(field_2 > field_3 and field_2 > field_4 ,field_2, 
    if(field_3 > field_4, field_3, field_4)))) AS total 
FROM my_table 
ORDER by total DESC 
LIMIT 0,10 
+0

爲什麼ORDER BY條件在這種情況下不起作用?你的例子會快速還是緩慢地工作?我在桌上有大約5000行。如果在MAX()中使用你的例子,它會給MySQL服務器增加一個額外的負載嗎?謝謝 – ilnur777 2011-06-07 21:20:02

+0

@ ilnur777,你有數據庫,所以測試一下它的運行速度有多快。我猜測它會在所有這些測試中運行緩慢。 – Johan 2011-06-07 21:26:15