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) example@sqldat.com
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