2011-08-24 16 views
5

Modifica: ridotto il problema. ecco un esempio più semplice:Come utilizzare una variabile @ con funzioni min/max?

mysql> select * from table_a; 
+-------+ 
| col_a | 
+-------+ 
|  1 | 
|  2 | 
|  3 | 
|  4 | 
+-------+ 
4 rows in set (0.00 sec) 

mysql> select @a:=max(col_a),@a from table_a; 
+----------------+------+ 
| @a:=max(col_a) | @a | 
+----------------+------+ 
|    4 | NULL | 
+----------------+------+ 
1 row in set (0.00 sec) 

Perché è @aNULL, e come posso convincerlo per non essere?

+1

Ho fatto un errore stupido quando ho provato la cosa alias che mi ha dato un risultato falso positivo, ho cancellato la risposta. – nobody

risposta

5

MySql manual è molto chiaro su questo, citazione:

Come regola generale, si dovrebbe mai assegnare un valore a una variabile utente e leggere il valore all'interno della stessa istruzione. Potresti ottenere i risultati che ti aspetti, ma questo non è garantito. L'ordine di valutazione per le espressioni che coinvolgono variabili utente non è definito e può variare in base agli elementi contenuti in una determinata istruzione; inoltre, questo ordine non è garantito essere lo stesso tra le versioni di MySQL Server. In SELECT @a, @a: = @ a + 1, ..., potresti pensare che MySQL valuterà prima @a e poi eseguirà un secondo. Tuttavia, la modifica dell'istruzione (ad esempio, aggiungendo una clausola GROUP BY, HAVING o ORDER BY) può far sì che MySQL selezioni un piano di esecuzione con un diverso ordine di valutazione.

1

non è possibile utilizzare la funzione di aggregazione per la maggior parte dei casi?

in altre parole, è difficile da indovinare quello che stai veramente cercando
(dun mente per aggiornare la tua domanda ancora?)

l'uso normale

select max(col_a) as anything 
from table_a 
order by anything; 

i dun vedo qualsiasi danno per questo sia

select max(col_a) as anything, max(col_a) as anything2, 
from table_a 
order by anything, anything2; 

se si prova zione di utilizzare la funzione di aggregazione per LIMIT,
questo non è fattibile

definite dall'utente variabili da selezionare non è affidabile (I usato essere un ventilatore)

http://dev.mysql.com/doc/refman/5.0/en/user-variables.html

Come regola generale, non si dovrebbe mai assegnare un valore a una variabile utente e leggere il valore all'interno della stessa istruzione. Potresti ottenere i risultati che ti aspetti, ma questo non è garantito. L'ordine di valutazione per le espressioni che coinvolgono variabili utente non è definito e può variare in base agli elementi contenuti in una determinata istruzione; inoltre, questo ordine non è garantito essere lo stesso tra le versioni di MySQL Server. In SELECT @a, @a: = @ a + 1, ..., potresti pensare che MySQL valuterà prima @a e poi eseguirà un secondo. Tuttavia, la modifica dell'istruzione (ad esempio, aggiungendo una clausola GROUP BY, HAVING o ORDER BY) può far sì che MySQL selezioni un piano di esecuzione con un diverso ordine di valutazione.

+0

eh ..? puoi spiegarlo un po 'di più? 'stamp_date' è un' INT' che memorizza un timestamp unix. Voglio mettere 'MIN (stamp_date)' in una variabile, perché ho bisogno di riutilizzare un sacco di volte nella mia query.La tua query non fa nemmeno riferimento a 'MIN (stamp_date)'. Oh ....... stai tagliando il primo stamp_date che sarà il minimo, non è vero? Perché dovrebbe funzionare, ma non 'min'? – mpen

+0

Ok, la follia di 'substring_index' recupera davvero lo stesso valore di' MIN', ma non vedo come questo risolva qualcosa. Non riesco ancora a lanciarlo in una variabile e riutilizzarlo. – mpen

+0

una volta che hai il valore start_time, puoi usare start_time per l'ordinamento – ajreal

Problemi correlati