2012-07-25 22 views
7

Come posso ordinare i valori da una tabella, crescente dal momento in cui sono stati inseriti. Non esiste una colonna speciale per questa materia, come un timestamp o un autoincremento.MySQL, ordine di ordinazione ORDER BY, nessuna colonna di ordinamento

So che non è consigliabile farlo ... Ancora mi piacerebbe sapere come fare questo.

Come ho capito dalle risposte, se non sono state aggiunte colonne di ordinamento, ad esempio: timestamp o autoincremental prima che i valori fossero inseriti, non è possibile ordinarli per inserimento.

risposta

7

Non vi è alcuna garanzia che le righe vengano restituite in un ordine particolare in assenza di una clausola ORDER BY nella query.

Per una query semplice che restituisce tutte le colonne di tutte le righe nella tabella ... ad es.

SELECT * FROM mytable ; 

Per una query, è probabile che MySQL eseguirà una scansione completa della tabella, a partire dall'inizio del tavolo, quindi è probabile che le righe saranno restituite nell'ordine in cui si trovano in deposito fisico.

Questo può approssimativamente corrispondere all'ordine in cui sono state inserite le righe, se non ci sono state eliminazioni, aggiornamenti e riorganizzazioni, in seguito lo spazio per una riga inserita è stato recuperato e riutilizzato per memorizzare una riga appena inserita.

Tuttavia, questo comportamento NON è garantito. Per restituire le righe nell'ordine in cui sono state inserite, è necessario disporre di tali informazioni (ovvero la sequenza in cui è stata inserita la riga) memorizzate all'interno di una colonna nella riga.

+0

Buona risposta. Sì, questo comportamento non è garantito, posso dire perché non sono ordinati in modo corrispondente dal momento dell'inserimento. – jacktrades

+0

Ma per quanto riguarda l'ordinamento delle righe in ordine decrescente man mano che vengono inserite –

+1

@Bhavesh Gangani: Sì, le righe possono essere inserite in una particolare sequenza. Ma questo * non * garantisce che un'istruzione SELECT restituirà le righe nell'ordine in cui sono state inserite le righe o in una particolare sequenza, eccetto la sequenza specificata in una clausola 'ORDER BY'. Se abbiamo bisogno di restituire le righe nell'ordine in cui sono state inserite, avremmo bisogno di avere queste informazioni disponibili per ogni riga. Di solito è memorizzato nella riga stessa, ma nel caso limite, potrebbe essere memorizzato in un'altra tabella dove può essere derivato per ogni riga. – spencer7593

0

È necessario che sia presente una colonna per ordinare la query. Di solito questo sarebbe un timestamp di inserimento o una chiave di identificazione/incremento incrementale. Non c'è modo di garantire l'ordine in caso contrario, perché non c'è traccia di esso.

relevant thread from MySQL forum

+0

100% sicuro che MySQL non ha alcuna registrazione sul tempo di inserimento o qualcosa di simile per ordinare questo? – jacktrades

+0

Perché non aggiungere semplicemente una colonna timestamp? E sì, sicuro al 100%. Per ordinare una query, hai bisogno di qualcosa per ordinarla * per *. – Dima

+0

Leggilo dal forum MySQL: 'In genere, non devi fare affidamento sull'ordine delle righe restituite dal DB quando non hai specificato alcun ordine' Non vedo alcuna certezza. – jacktrades

1

È possibile ORDER BY qualcosa che si può uscire dal vostro tavolo. Se non hai nulla che possa essere usato per trovare l'ordine che ti serve, non puoi ordinare da esso.

+0

È accurato al 100%? – jacktrades

+2

Beh, sarebbe strano aggiungere una risposta che so essere falsa, ora, no? La risposta che hai accettato fondamentalmente dice la stessa cosa, ma in qualche modo sembra implicare che potresti fare qualcos'altro, che davvero non puoi. Se non puoi ordinare, non puoi ordinare. Il resto non vale davvero la pena menzionare .. – Nanne

1

A seconda dei dati nella tabella, è possibile ordinare tramite l'id dei dati - se i dati hanno un singolo numero intero incrementale per assicurare l'univocità PK. Non c'è altro modo di ordinare sull'ordine di inserimento a meno che i dati non vengano catturati e registrati nella tabella.

Non conosco nulla in MySQL che mantenga informazioni extra (meta) sui record che non sono stati specificati a livello di tabella.

Problemi correlati