Если UNION
решит проблему, вот несколько советов по синтаксису и оптимизации.
Это обеспечит страницу 21 из 10 строк:
(
( SELECT ... LIMIT 210 )
UNION [ALL|DISTINCT]
( SELECT ... LIMIT 210 )
) ORDER BY ... LIMIT 10 OFFSET 200
Обратите внимание, что 210 = 200 + 10. Вы не можете доверять, используя OFFSET
во внутреннем SELECTs
.
Используйте UNION ALL
для скорости, но если между SELECTs
могут быть повторяющиеся строки, тогда явно скажите UNION DISTINCT
.
Если вы уберете слишком много скобок, вы получите либо синтаксические ошибки, либо «неправильные» результаты.
Если вы получите подзапрос, повторите ORDER BY
, но не LIMIT
:
SELECT ...
FROM (
( SELECT ... LIMIT 210 )
UNION [ALL|DISTINCT]
( SELECT ... LIMIT 210 )
ORDER BY ... LIMIT 10 OFFSET 200
) AS u
JOIN something_else ON ...
ORDER BY ...
Одна из причин, которая может включать JOIN
, связана с производительностью - подзапрос u
свел результирующий набор до 10 строк, поэтому JOIN
будет иметь только 10 вещей для поиска. Помещение JOIN
внутри приведет к большому количеству соединений, а затем сократится до 10.