Tylko jedno ORDER BY
Klauzula może być zdefiniowana dla UNION
zapytam. Nie ma znaczenia, czy używasz UNION
lub UNION ALL
. MySQL obsługuje LIMIT
klauzula dotycząca fragmentów UNION
zapytanie, ale jest stosunkowo bezużyteczne bez możliwości zdefiniowania kolejności.
MySQL nie ma również funkcji rankingowych, które trzeba uzupełnić o luki w danych (brakujące z powodu usuwania wpisów). Jedyną alternatywą jest użycie zmiennej inkrementującej w instrukcji SELECT:
SELECT t.id,
@rownum := @rownum+1 as rownum
FROM MEDIA t, (SELECT @rownum := 0) r
Teraz możemy otrzymać kolejno ponumerowaną listę wierszy, więc możemy użyć:
WHERE rownum BETWEEN @midpoint - ROUND(@midpoint/2)
AND @midpoint - ROUND(@midpoint/2) [email protected]
Używając 7 jako wartości dla @midpoint, @midpoint - ROUND(@midpoint/2)
zwraca wartość 4
. Aby uzyskać łącznie 10 wierszy, ustaw wartość @upperlimit na 10. Oto pełne zapytanie:
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
Ale jeśli nadal chcesz używać LIMIT
, możesz użyć:
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