2013-07-24 64 views
7

有什麼方法可以找到3個不同列的最大值?我試圖找到記錄有任何3列值超過規定值,並且儘量避免在查詢做出這樣的事:來自3個不同列的Mysql最大值

column1 > 69 or column2 > 69 or column3 > 69 

表結構是這樣的:

id | column1 | column2 | column3 
1 | 5  | 4 | 3 
2 | 70  | 1 | 65 
3 | 66  | 3 | 90 

而選擇像這樣:

select id from tablex where column1 > 69 or column2 > 69 or column3 > 69 

-- but with better query, a bit prettier like this (it doesn't work of course) 

select id from tablex where MAX(column1, column2, column3) > 69 
+1

* RE:試圖避免做出這樣的事情*爲什麼?它不是非常漫長或神祕。雖然一條襯裏很好,但如果它們都產生相同的結果,性能就更重要。在選擇方法之前,您可能需要檢查查詢計劃。如果他們是相同的(我不知道他們是否是...)選擇一個你喜歡的。否則,我會選擇更高效的語法。 – Leigh

+0

是的,但這仍然是簡單的一次性腳本,將不時使用。更重要的是邏輯結構和可讀性比性能本身;) – J33nn

+0

啊,好吧。我沒有意識到這是一次性的。在這種情況下,我同意業績不那麼重要。如果您有機會查看查詢計劃,請告訴我們;-)如果有任何區別,我會很好奇。 – Leigh

回答

14

你需要使用GREATEST

這樣

select id from tablex where GREATEST(column1, column2, column3) > 69 
+0

真的......我在同一時間來到這個答案:)謝謝! – J33nn

+0

歡迎您:)。 –

5

我想指出的是:

where GREATEST(column1, column2, column3) > 69; 

一樣:

where column1 > 69 or column2 > 69 or column3 > 69; 

第一個將過濾掉所有行,其中的任何三個列是NULL。第二個將仍然考慮這些行。你可以重寫GREATEST()查詢爲:

where GREATEST(coalesce(column1, 0), coalesce(column2, 0), coalesce(column3, 0)) > 69; 

但違背了簡單的語法的目的。你可能知道列值永遠不是NULL,在這種情況下使用greatest()是好的。但是,這不是一個普通的替代品。

+0

不錯的地方。我沒有意識到「最大」的包含空值。 (雖然完全意義。) – Leigh