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) [email protected]
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