2013-07-24 20 views
7

C'è un modo per trovare il valore massimo di 3 colonne diverse? Sto cercando di trovare i record con una qualsiasi delle 3 colonne valore superiore al valore specificato e cercando di evitare di fare qualcosa di simile in query:Valore massimo Mysql da 3 diverse colonne

column1 > 69 or column2 > 69 or column3 > 69 

Struttura della tabella è come questo:

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

e selezionare in questo modo:

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: cercando di evitare di fare qualcosa del genere * Perché? Non è estremamente lungo o criptico. Mentre un liner è bello, se entrambi producono lo stesso risultato, le prestazioni sono più importanti. Potresti esaminare i piani di query prima di scegliere un approccio. Se sono uguali (non so se lo siano o no ..) scegli quello che preferisci. Altrimenti, sceglierei la sintassi più efficiente. – Leigh

+0

Sì, ma ancora questo è semplice script una volta che verrà utilizzato di volta in volta. Più importante è la struttura logica e la leggibilità rispetto alle prestazioni stesse;) – J33nn

+0

Ah, ok. Non avevo capito che era un pezzo unico. In tal caso sono d'accordo che le prestazioni sono meno critiche. Se hai la possibilità di guardare i piani di query, faccelo sapere ;-) Sarei curioso di sapere se c'è qualche differenza. – Leigh

risposta

14

è necessario utilizzare GREATEST

come quella

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

Vero ... Sono arrivato a questa risposta come nello stesso tempo :) Grazie! – J33nn

+0

sei il benvenuto :). –

5

Voglio precisare che:

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

è non lo stesso:

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

La prima filtrerà tutte le righe in cui uno dei tre colonne è NULL. Il secondo considererà ancora queste righe. Si potrebbe riscrivere la query GREATEST() come:

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

ma che sconfigge lo scopo della sintassi più semplice. È possibile conoscere che i valori di colonna non sono mai NULL, nel qual caso l'utilizzo di greatest() è ok. Ma non è un sostituto generale.

+0

Buon posto. Non mi ero reso conto che 'greatest' includeva valori nulli. (Ha comunque un senso compiuto). – Leigh

Problemi correlati