Pouze jeden ORDER BY
klauzuli lze definovat pro UNION
'd dotaz. Nezáleží na tom, zda používáte UNION
nebo UNION ALL
. MySQL podporuje LIMIT
klauzule na částech UNION
'd dotazu, ale bez možnosti definovat pořadí je to relativně k ničemu.
MySQL také postrádá hodnotící funkce, které musíte řešit s mezerami v datech (chybějící kvůli mazání záznamů). Jedinou alternativou je použití inkrementační proměnné v příkazu SELECT:
SELECT t.id,
@rownum := @rownum+1 as rownum
FROM MEDIA t, (SELECT @rownum := 0) r
Nyní můžeme získat postupně očíslovaný seznam řádků, takže můžeme použít:
WHERE rownum BETWEEN @midpoint - ROUND(@midpoint/2)
AND @midpoint - ROUND(@midpoint/2) [email protected]
Použití 7 jako hodnoty pro @midpoint, @midpoint - ROUND(@midpoint/2)
vrátí hodnotu 4
. Chcete-li získat celkem 10 řádků, nastavte hodnotu @upperlimit na 10. Zde je úplný dotaz:
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
Pokud ale přesto chcete použít LIMIT
, můžete použít:
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