Si vous avez déjà essayé d’utiliser un LIMIT dans une sous-requête vous avez très certainement rencontré ce message ci:
This version of MySQL doesn’t yet support ‘LIMIT & IN/ALL/ANY/SOME subquery’
Heureusement, il y a la possibilité de contourner cela selon une astuce similaire à celle présentée dans un article précédent.
Prenons l’exemple d’une table qui sert de file d’attente pour l’envoi d’emails. La requête suivante est acceptée par MySQL:
SELECT * FROM email_queue LIMIT 0,200
Donc on peut sélectionner les premiers 200 emails en attente. Par contre, cette requête est réfusée:
DELETE FROM email_queue where id in (select id from email_queue LIMIT 0,200)
Comment procéder alors? Il s’agit de tout simplement reprendre le SELECT initial dans un alias avec un SELECT et le mot clé AS comme suit:
DELETE FROM email_queue WHERE id IN (SELECT * FROM (SELECT id FROM email_queue LIMIT 0,200) AS temp)
Ainsi on a la possibilité d’à la fois sélectionner des emails avec un LIMIT mais également de les supprimer ou les mettre à jour (UPDATE) selon les mêmes critères.
– James Poulson.
Merci pour cette astuce.
Elle m’a bien aidé même pour un SELECT classique.