Il comportamento descritto si verifica quando si è ORDER BY
un'espressione non presente nella clausola SELECT
. Lo standard SQL non consente una simile query ma MySQL è meno severo e lo consente.
Proviamo un esempio:
SELECT DISTINCT colum1, column2
FROM table1
WHERE ...
ORDER BY column3
Diciamo che il contenuto della tabella table1
è:
id | column1 | column2 | column3
----+---------+---------+---------
1 | A | B | 1
2 | A | B | 5
3 | X | Y | 3
senza la clausola ORDER BY
, i ritorni di query di cui sopra seguenti due record (senza ORDER BY
l'ordine non è garantito):
column1 | column2
---------+---------
A | B
X | Y
Ma con ORDER BY column3
anche l'ordine non è garantito.
La clausola DISTINCT
opera sui valori delle espressioni presenti nella clausola SELECT
. Se la riga n. 1 viene elaborata per prima (A
, B
) viene inserita nel set di risultati ed è associata alla riga n. Quindi, quando viene elaborata la riga n. 2, i valori delle espressioni SELECT
producono il record (A
, B
) già presente nel set di risultati. A causa di DISTINCT
viene eliminato. La riga n. 3 produce (X
, Y
) che viene inserita anche nel set di risultati. Quindi, la clausola ORDER BY column3
ordina i record nel set di risultati come (A
, B
), (X
, Y
).
Ma se riga # 2 è elaborato prima riga # 1 allora, seguendo la stessa logica esposto nel paragrafo precedente, i record nel set di risultati sono ordinati come (X
, Y
), (A
, B
).
Non esiste alcuna regola imposta al motore del database sull'ordine in cui elabora le righe quando viene eseguita una query. Il database è libero di elaborare le righe in qualsiasi ordine che ritenga sia meglio per le prestazioni.
La query non è valida SQL e il fatto che possa restituire risultati diversi utilizzando gli stessi dati di input lo dimostra.
Quali sono le query che si sta tentando di eseguire? – srivani
@srivani: seleziona un ID distinto dalla tabella in cui id2 = 12312 ordine per ora desc. – insomiac
So che è troppo tardi ma non c'è ancora una risposta accettata, quindi voglio sapere se l'OP vuole ancora una risposta per qualcosa che non è coperto nelle risposte date? –