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

