Domanda

Vorrei costruire una query che mostri tutti i risultati in una tabella, ma è sfalsata di 5 dall'inizio della tabella. Per quanto ne so, il LIMIT di MySQL richiede un limite e un offset. C'è un modo per farlo?

È stato utile?

Soluzione

Dal Manuale MySQL su LIMIT :

  

Per recuperare tutte le righe da un determinato   offset fino alla fine del risultato   set, puoi usare un numero grande per   il secondo parametro. Questa dichiarazione   recupera tutte le righe dalla 96a riga   fino all'ultimo:

SELECT * FROM tbl LIMIT 95, 18446744073709551615;

Altri suggerimenti

Come hai detto, è necessario LIMIT, quindi è necessario utilizzare il limite più grande possibile, che è 18446744073709551615 (massimo di BIGINT non firmato)

SELECT * FROM somewhere LIMIT 18446744073709551610 OFFSET 5

Come notato in altre risposte, MySQL suggerisce di utilizzare 18446744073709551615 come numero di record nel limite, ma considera questo: cosa faresti se avessi indietro 18.446.744.073.709.551.615 record? In effetti, cosa faresti se avessi 1.000.000.000 di record?

Forse vuoi più di un miliardo di dischi, ma il mio punto è che c'è un limite al numero che vuoi , ed è inferiore a 18 quintilioni. Per motivi di stabilità, ottimizzazione e possibilmente usabilità, suggerirei di porre un limite significativo alla query. Ciò ridurrebbe anche la confusione per chiunque non abbia mai visto quel numero dall'aspetto magico e avrebbe l'ulteriore vantaggio di comunicare almeno quanti record sei disposto a gestire contemporaneamente.

Se devi davvero ottenere tutti i 18 quintilioni di record dal tuo database, forse quello che vuoi davvero è afferrarli con incrementi di 100 milioni e eseguire il ciclo 184 miliardi di volte.

Un altro approccio sarebbe quello di selezionare una colonna auto-incrementata e quindi filtrarla usando HAVING.

SET @a := 0; 
select @a:=@a + 1 AS counter, table.* FROM table 
HAVING counter > 4

Ma probabilmente rimarrei con l'approccio del limite alto.

Proprio oggi stavo leggendo il modo migliore per ottenere enormi quantità di dati (oltre un milione di righe) da una tabella mysql. Un modo è, come suggerito, usare LIMIT x, y dove x è l'offset e y l'ultima riga che si desidera restituire. Tuttavia, come ho scoperto, non è il modo più efficiente per farlo. Se hai una colonna di incremento automatico, puoi utilizzare facilmente un'istruzione SELECT con una clausola WHERE che dice da quale record desideri iniziare.

Ad esempio,      SELEZIONA * DA table_name DOVE id > x;

Sembra che mysql ottenga tutti i risultati quando si utilizza LIMIT e quindi mostra solo i record che si adattano all'offset: non i migliori per le prestazioni.

Fonte: risposta a questa domanda Forum MySQL . Basta prendere nota, la domanda ha circa 6 anni.

Puoi usare un'istruzione MySQL con LIMIT:

START TRANSACTION;
SET @my_offset = 5;
SET @rows = (SELECT COUNT(*) FROM my_table);
PREPARE statement FROM 'SELECT * FROM my_table LIMIT ? OFFSET ?';
EXECUTE statement USING @rows, @my_offset;
COMMIT;

Testato in MySQL 5.5.44. Pertanto, possiamo evitare l'inserimento del numero 18446744073709551615.

nota: la transazione assicura che la variabile @rows sia in accordo con la tabella considerata nell'esecuzione dell'istruzione.

So che questo è vecchio ma non ho visto una risposta simile, quindi questa è la soluzione che vorrei usare.

Innanzitutto, esegui una query di conteggio sulla tabella per vedere quanti record esistono. Questa query è veloce e normalmente il tempo di esecuzione è trascurabile. Qualcosa del tipo:

SELECT COUNT(*) FROM table_name;

Quindi creerei la mia query usando il risultato che ho ottenuto dal conteggio come mio limite (dato che è il numero massimo di righe che la tabella potrebbe restituire). Qualcosa del tipo:

SELECT * FROM table_name LIMIT count_result OFFSET desired_offset;

O forse qualcosa del genere:

SELECT * FROM table_name LIMIT desired_offset, count_result;

Naturalmente, se necessario, è possibile sottrarre desiderata_offset da count_result per ottenere un valore effettivo e preciso da fornire come limite. Passando il "18446744073709551610" il valore non ha senso se posso effettivamente determinare un limite appropriato da fornire.

WHERE .... AND id > <YOUROFFSET>

id può essere qualsiasi incremento automatico o colonna numerica univoca che hai ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top