Мне нужно получить данные на основе года с разбивкой на страницы, если число строк меньше, то поиск в следующем году
SELECT *
FROM `user_notifications`
WHERE DATE_FORMAT(created_at, '%Y') = '2019'
ORDER BY `created_at` DESC
LIMIT 0,10
если количество строк меньше 10, то поиск по году 2018
Я думаю, что вам просто нужно WHERE
пункт, чтобы включить и 2018 и 2019:
SELECT *
FROM user_notifications
WHERE YEAR(created_at) IN (2018, 2019)
ORDER BY created_at DESC
LIMIT 10;
Учитывая, что ваши результаты отсортированы по created_at DESC
Я не думаю, что WHERE
пункт нужен вообще. Если с 2019 года будет недостаточно результатов, ваш запрос будет автоматически возвращать результаты с 2018, 2017, 2016 и т. Д. По мере необходимости, чтобы получить 10 строк:
SELECT *
FROM `user_notifications`
ORDER BY `created_at` DESC
LIMIT 10
Если я правильно прочитал, это звучит как простое упражнение по заказу
SELECT *
FROM user_notifications
WHERE created_at < :input_year + INTERVAL 1 YEAR
ORDER BY created_at DESC
LIMIT :offset, 10;
Если вы хотите вернуться только на один год назад, вы можете просто добавить другое условие
SELECT *
FROM user_notifications
WHERE created_at < :input_year + INTERVAL 1 YEAR
AND created_at >= :input_year - INTERVAL 1 YEAR
ORDER BY created_at DESC
LIMIT :offset, 10;
Не то чтобы с помощью функции, как YEAR()
на created_at
а не сравнение (<,> =) не позволит двигателю использовать индекс created_at
использование https://dev.mysql.com/doc/refman/8.0/en/year.html
SELECT *
FROM user_notifications
WHERE YEAR(created_at) <= $searchYear
ORDER BY created_at DESC
LIMIT 0, 10;