Slechts één ORDER BY
clausule kan worden gedefinieerd voor een UNION
zou vragen. Het maakt niet uit of je UNION
. gebruikt of UNION ALL
. MySQL ondersteunt de LIMIT
clausule op delen van een UNION
'd query, maar het is relatief nutteloos zonder de mogelijkheid om de volgorde te definiëren.
MySQL mist ook rangschikkingsfuncties, die u nodig hebt om hiaten in de gegevens op te lossen (ontbrekend omdat vermeldingen worden verwijderd). Het enige alternatief is om een oplopende variabele te gebruiken in de SELECT-instructie:
SELECT t.id,
@rownum := @rownum+1 as rownum
FROM MEDIA t, (SELECT @rownum := 0) r
Nu kunnen we een opeenvolgend genummerde lijst van de rijen krijgen, zodat we het volgende kunnen gebruiken:
WHERE rownum BETWEEN @midpoint - ROUND(@midpoint/2)
AND @midpoint - ROUND(@midpoint/2) [email protected]
Gebruik 7 als waarde voor @midpoint, @midpoint - ROUND(@midpoint/2)
retourneert een waarde van 4
. Om in totaal 10 rijen te krijgen, stelt u de @upperlimit-waarde in op 10. Dit is de volledige zoekopdracht:
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
Maar als je nog steeds LIMIT
wilt gebruiken , kunt u gebruiken:
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