IN (che chiamerò sottoquery) attualmente non è possibile utilizzare la clausola LIMIT.
Una soluzione consiste nel convertire le query che presentano una clausola SELECT IN in query che adoperano un INNER JOIN tra la tabella d’origine e la sottoquery contenuta nel ramo IN. A quest’ultima, infatti, può essere assegnato un alias che permette di utilizzarla come fosse una vista.
SELECT * FROM products WHERE id IN (SELECT ... FROM ... WHERE...)
Nell’esempio soprastante, la SELECT più esterna va a recuperare tutti i recordset di products in cui il valore di id è uguale ad uno di quelli recuperati dalla sottoquery.
Per limitare i risultati della query (ad esempio in caso di paginazione del risultato) occorre specificare la clausola LIMIT nella query più esterna, in questo modo:
SELECT * FROM products WHERE id IN (SELECT ... FROM ... WHERE...) LIMIT 0,10
Così facendo, però, la sottoquery tornerà tutti i risultati che rispettano la rispettiva clausola WHERE per poi limitare la scelta ai primi dieci risultati con una clausola LIMIT 0,10 nella query più esterna.
Riscrivendo la query nel modo seguente, non solo si riesce ad utilizzare la clausola LIMIT nella sottoquery ma si ottengono miglioramenti notevoli nelle performance.
SELECT p.* FROM products p INNER JOIN (SELECT ... FROM ... WHERE ... LIMIT 0,10) sq ON p.id=sq.id

Informazioni su questo blog
Abbonati ai Feed RSS di questo Blog
Scarica il nostro software


Grazie infinite, era proprio quello che mi serviva. Nel mio caso ho un catalogo di prodotti con la caratteristica che ogni prodotto può essere di uno o più modelli diversi (ad esempio un vaso in plastica con diverse misure e prezzi diversi per ogni misura). La tabella dei prodotti è autoreferenziata, i modelli diversi di un prodotto hanno la chiave esterna riferita al modello principale ( e ovviamente il modello principale è riferito a se stesso). Avevo la necessità di creare una lista con 20 prodotti per pagina e tutti i modelli di ogni prodotto (quindi in totale il numero di righe per pagina è maggiore o uguale a 20). Questo è il codice che ho usato: SELECT * FROM `prodotto` AS p1
INNER JOIN (
SELECT DISTINCT (
`prodotto_prodotto_id`
)
FROM `prodotto`
LIMIT 0 , 10
) AS p2 ON p1.prodotto_prodotto_id = p2.prodotto_prodotto_id
GRAZIE ANCORA, CIAO!