(SELECT * FROM posts
WHERE `timestamp` >= NOW() - INTERVAL 30 DAY)
UNION
(SELECT * FROM posts
ORDER BY `timestamp` DESC
LIMIT 10);
edit: Комментарий Re @ doofledorfer: Я запустил это в своей тестовой базе данных, и она работала нормально. Я попытался сравнить timestamp
с литералом даты, а также с константным выражением, как показано в приведенном выше запросе, но это не имело никакого значения для плана оптимизации. Конечно, я использовал тривиальный объем данных, и план оптимизации может отличаться, если в нем тысячи строк.
В любом случае, ОП спрашивал, как получить правильный результат в одном запросе, , а не , как сделать план выполнения оптимальным. В конце концов, это запрос UNION, и он должен выполнять сортировку файлов.
+------+--------------+------------+------+---------------+------+---------+------+------+----------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+------+--------------+------------+------+---------------+------+---------+------+------+----------------+
| 1 | PRIMARY | posts | ALL | timestamp | NULL | NULL | NULL | 20 | Using where |
| 2 | UNION | posts | ALL | NULL | NULL | NULL | NULL | 20 | Using filesort |
| NULL | UNION RESULT | <union1,2> | ALL | NULL | NULL | NULL | NULL | NULL | |
+------+--------------+------------+------+---------------+------+---------+------+------+----------------+