Kun én ORDER BY klausul kan defineres for en UNION ville forespørge. Det er lige meget, om du bruger UNION eller UNION ALL . MySQL understøtter LIMIT klausul om dele af en UNION 'd forespørgsel, men det er relativt ubrugeligt uden mulighed for at definere rækkefølgen.
MySQL mangler også rangeringsfunktioner, som du skal bruge for at håndtere huller i dataene (mangler på grund af slettede poster). Det eneste alternativ er at bruge en stigende variabel i SELECT-sætningen:
SELECT t.id,
@rownum := @rownum+1 as rownum
FROM MEDIA t, (SELECT @rownum := 0) r
Nu kan vi få en fortløbende nummereret liste over rækkerne, så vi kan bruge:
WHERE rownum BETWEEN @midpoint - ROUND(@midpoint/2)
AND @midpoint - ROUND(@midpoint/2) example@sqldat.com
Brug af 7 som værdi for @midtpunkt, @midpoint - ROUND(@midpoint/2) returnerer værdien 4 . For at få 10 rækker i alt skal du indstille @upperlimit-værdien til 10. Her er hele forespørgslen:
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
Men hvis du stadig vil bruge LIMIT , kan du bruge:
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