Вы можете использовать UNION , чтобы добавить дополнительную строку в ваш набор результатов. Эти запросы будут работать для более старых MySQL версий (протестировано на 5.7.26).
Есть несколько вариантов, как этого добиться, вы можете добавить 8 лучших строк из вашей таблицы и позволить UNION
фильтровать дубликаты. и затем выберите только одну запись, добавив LIMIT 8
в конец запроса:
(SELECT *
FROM news
WHERE STR_TO_DATE(day, '%d %M %Y') >= DATE_SUB(curdate(), INTERVAL 1 WEEK)
ORDER BY mostRead DESC
LIMIT 7)
UNION
(SELECT *
FROM news
ORDER BY str_to_date(day, '%d %M %Y') DESC
LIMIT 8)
LIMIT 8
Или вы можете отфильтровать строки самостоятельно, что больше подходит для сложных случаев использования.
(SELECT *
FROM news
WHERE STR_TO_DATE(DAY, '%d %M %Y') >= DATE_SUB(curdate(), INTERVAL 1 WEEK)
ORDER BY mostRead DESC
LIMIT 7)
UNION
(SELECT *
FROM news
WHERE id NOT IN
(SELECT id
FROM
(SELECT *
FROM news
WHERE STR_TO_DATE(day, '%d %M %Y') >= DATE_SUB(curdate(), INTERVAL 1 WEEK)
ORDER BY mostRead DESC
LIMIT 7) temp)
ORDER BY str_to_date(day, '%d %M %Y') DESC
LIMIT 1)
Мы добавили temp
таблицу, поскольку старые версии MySQL не поддерживают подзапрос LIMIT & IN / ALL / ANY / SOME.