У меня есть разбитый на страницы список статей, которые нужно отсортировать по рангу, но когда статья имеет позицию <> 0, она должна быть вставлена в эту конкретную позицию.
Я думал, что смогу по крайней мере получить статьи с правильной позицией, извлеченной для текущей страницы, а затем отсортировать их в PHP, чтобы затем показать в правильном положении.
Я хочу сделать это в MySQL только с одним запросом
Некоторые из моих попыток:
Этот запрос пытается сначала выбрать статьи, которые имеют правильную позицию для текущей страницы, а затем статьи с самым высоким рангом
SELECT id, rank_score, position
FROM Articles
ORDER BY ((position <= (50 * 1)) AND (position > 50 * (1-1))) DESC, rank_score DESC
LIMIT 0, 50
50 - количество статей, отображаемых на странице, а 1 - номер текущей страницы, они добавляются при генерации запроса.
В этом запросе проблема заключается в том, что на странице 2 результаты неверны, поскольку, добавив LIMIT 50,50, вы можете выйти за рамки статей, которые имеют позицию на этой странице.
Еще одна попытка:
SELECT (
SELECT id, rank_score, position
FROM Articles
ORDER BY ((position <= (50 * 1)) AND (position > 50 * (1-1))) DESC, rank_score DESC
LIMIT 50)
UNION (
SELECT id, rank_score, position
FROM Articles
ORDER BY rank_score DESC LIMIT x)
Для корректной работы второго запроса должен быть установлен предел, равный количеству строк, возвращаемых из первого запроса.
Кроме того, в любое время статья, которая имеет очень высокий рейтинг, но также и очень высокую позицию, будет показана раньше, поскольку позиция игнорируется во втором запросе.