Само един ORDER BY
клаузата може да бъде дефинирана за UNION
бих запитал. Няма значение дали използвате UNION
или UNION ALL
. MySQL поддържа LIMIT
клауза за части от UNION
бих поискал, но е относително безполезен без възможността за дефиниране на реда.
MySQL също няма функции за класиране, които трябва да се справите с пропуски в данните (липсващи поради изтриване на записи). Единствената алтернатива е да използвате нарастваща променлива в израза SELECT:
SELECT t.id,
@rownum := @rownum+1 as rownum
FROM MEDIA t, (SELECT @rownum := 0) r
Сега можем да получим последователно номериран списък с редовете, за да можем да използваме:
WHERE rownum BETWEEN @midpoint - ROUND(@midpoint/2)
AND @midpoint - ROUND(@midpoint/2) [email protected]
Използване на 7 като стойност за @midpoint, @midpoint - ROUND(@midpoint/2)
връща стойност от 4
. За да получите общо 10 реда, задайте стойността @upperlimit на 10. Ето пълната заявка:
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
Но ако все пак искате да използвате LIMIT
, можете да използвате:
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