Endast en ORDER BY
sats kan definieras för en UNION
skulle fråga. Det spelar ingen roll om du använder UNION
eller UNION ALL
. MySQL stöder LIMIT
sats på delar av en UNION
'd fråga, men det är relativt värdelöst utan möjlighet att definiera ordningen.
MySQL saknar också rankningsfunktioner, vilket du behöver för att hantera luckor i data (saknas på grund av att poster raderas). Det enda alternativet är att använda en inkrementerande variabel i SELECT-satsen:
SELECT t.id,
@rownum := @rownum+1 as rownum
FROM MEDIA t, (SELECT @rownum := 0) r
Nu kan vi få en fortlöpande numrerad lista över raderna, så att vi kan använda:
WHERE rownum BETWEEN @midpoint - ROUND(@midpoint/2)
AND @midpoint - ROUND(@midpoint/2) [email protected]
Använder 7 som värde för @midpoint, @midpoint - ROUND(@midpoint/2)
returnerar värdet 4
. För att få 10 rader totalt, ställ in @upperlimit-värdet till 10. Här är hela frågan:
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 om du fortfarande vill använda LIMIT
, kan du använda:
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