Un seul ORDER BY
la clause peut être définie pour un UNION
'd requête. Peu importe si vous utilisez UNION
ou UNION ALL
. MySQL prend en charge la LIMIT
clause sur des portions d'un UNION
'd requête, mais c'est relativement inutile sans la possibilité de définir l'ordre.
MySQL manque également de fonctions de classement, dont vous avez besoin pour gérer les lacunes dans les données (manquantes en raison de la suppression d'entrées). La seule alternative est d'utiliser une variable d'incrémentation dans l'instruction SELECT :
SELECT t.id,
@rownum := @rownum+1 as rownum
FROM MEDIA t, (SELECT @rownum := 0) r
Nous pouvons maintenant obtenir une liste numérotée consécutivement des lignes, nous pouvons donc utiliser :
WHERE rownum BETWEEN @midpoint - ROUND(@midpoint/2)
AND @midpoint - ROUND(@midpoint/2) [email protected]
En utilisant 7 comme valeur pour @midpoint, @midpoint - ROUND(@midpoint/2)
renvoie une valeur de 4
. Pour obtenir 10 lignes au total, définissez la valeur @upperlimit sur 10. Voici la requête complète :
SELECT x.*
FROM (SELECT t.id,
@rownum := @rownum+1 as rownum
FROM MEDIA t,
(SELECT @rownum := 0) r) x
WHERE x.rownum BETWEEN @midpoint - ROUND(@midpoint/2) AND @midpoint - ROUND(@midpoint/2) + @upperlimit
Mais si vous souhaitez toujours utiliser LIMIT
, vous pouvez utiliser :
SELECT x.*
FROM (SELECT t.id,
@rownum := @rownum+1 as rownum
FROM MEDIA t,
(SELECT @rownum := 0) r) x
WHERE x.rownum >= @midpoint - ROUND(@midpoint/2)
ORDER BY x.id ASC
LIMIT 10