9. LIMIT


Clausola LIMIT

La clausola LIMIT ci servirà per limitare il numero di record restituiti da una query.
L'istruzione va posta alla fine della query, e può prendere uno o due parametri.

Nel caso in cui passate alla LIMIT un solo parametro, otterrete i primi N record che soddisfano i criteri della query, dove N è il parametro passato.
Per fare un esempio, con la query che segue otterrete i primi venti utenti così come sono memorizzati sul database:

SELECT * FROM `utenti` LIMIT 20;

Nota bene: se facendo qualche prova su tabelle esistenti la query non restituisce i record nell'ordine in cui sono stati memorizzati, dovrete forzare il risultato tramite una ORDER BY, pratica che consiglio comunque ogni qual volta vi sarà necessario ottenere il result set ordinato.
Il motivo per cui senza ORDER BY i record possano risultare non ordinati, è perchè potrebbero cambiare effetivamente ordine interno anche dopo semplici operazioni di modifica (UPDATE).

Il secondo modo in cui potete utilizzare la LIMIT è con due parametri, che rappresentano rispettivamente l'offset ed il numero di record da prelevare.

Per offset si intende il punto di partenza dove MySQL comincerà a leggere.
Questo parametro viene utilizzato quando è necessario paginare i risultati come nella stragrande maggioranza dei siti web.

Faccio un esempio. Poniamo di dover visualizzare un catalogo di prodotti, mostrando 10 prodotti per pagina.
Per capire il funzionamento scriverò di seguito le prime tre query che serviranno rispettivamente la prima, la seconda e la terza pagina di prodotti:

SELECT * FROM `prodotti` LIMIT 0, 10; # Primi 10 prodotti

SELECT * FROM `prodotti` LIMIT 10, 10; # Seconda decina di prodotti

SELECT * FROM `prodotti` LIMIT 20, 10; # Terza decina di prodotti

Dal momento che l'offset parte da zero e solitamente riceviamo come numero di pagina un intero maggiore o uguale a uno, il calcolo standard è il seguente:

// Per convenzione in questo esempio utilizzerò PHP

define('PRODOTTI_PER_PAGINA', 10);

$pagina = (int) $_GET['pag'];

if ($pagina < 1)
	$pagina = 1;

$offset = ($pagina - 1) * PRODOTTI_PER_PAGINA;
$query = 'SELECT * FROM `prodotti` LIMIT ' . $offset . ', ' . PRODOTTI_PER_PAGINA . ';';