2013-07-24 13 views
7

Czy istnieje sposób na znalezienie maksymalnej wartości 3 różnych kolumn? Próbuję znaleźć rekordy z żadnym z 3 kolumny wartości wyższej niż określona wartość i stara się uniknąć czegoś takiego w zapytaniu:Wartość maksymalna Mysql z 3 różnych kolumn

column1 > 69 or column2 > 69 or column3 > 69 

struktura tabeli jest tak:

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

i wybierz tak:

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: Próbujesz uniknąć czegoś takiego * Dlaczego? Nie jest ekstremalnie długa ani tajemnicza. Podczas, gdy jedna wkładka jest przyjemna, jeśli oba dają taki sam wynik, ważniejsza jest wydajność. Możesz rozważyć plany kwerend, zanim wybierzesz podejście. Jeśli są takie same (nie wiem, czy są, czy nie) wybierz tę, którą preferujesz. W przeciwnym razie pójdę z wydajniejszą składnią. – Leigh

+0

Tak, ale nadal jest to prosty skrypt, który będzie używany od czasu do czasu. Ważniejsza jest struktura logiczna i czytelność niż sama wydajność;) – J33nn

+0

Ah, okay. Nie zdawałem sobie sprawy, że to był jednorazowy. W takim przypadku zgadzam się, że wydajność jest mniej krytyczna. Jeśli masz szansę spojrzeć na plany zapytań, daj nam znać ;-) Byłbym ciekawy, czy jest jakakolwiek różnica. – Leigh

Odpowiedz

14

trzeba użyć GREATEST

jak ten

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

Prawda ... Przyszedłem do tej odpowiedzi jak w tym samym czasie :) Dzięki! – J33nn

+0

zapraszamy :). –

5

Chcę podkreślić, że:

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

jest nie taki sam jak:

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

Pierwszy będzie odfiltrować wszystkie wiersze, gdzie dowolny z trzech kolumny to NULL. Drugi będzie nadal rozważał te wiersze. Można przepisać zapytanie GREATEST() jak:

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

ale pokonuje cel prostszej składni. Możesz wiedzieć,, że wartości kolumn nigdy nie są NULL, w takim przypadku przy użyciu greatest() jest w porządku. Ale to nie jest ogólny zamiennik.

+0

Dobre miejsce. Nie zdawałem sobie sprawy, że "największy" zawiera wartości null. (Ma to jednak sens.) – Leigh

Powiązane problemy