Я хочу, чтобы получить статистику зарегистрированных пользователей в месяц за прошедший год, так что я построил этот запросMySQL расчет даты в ИНЕКЕ
SELECT MONTH(created_at) as m, COUNT(*) as c
FROM users
WHERE created_at >= DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 12 MONTH), '%Y-%m')
GROUP BY m
Теперь я понимаю, MySQL будет делать это
- Выбрать все строки
- Выполните проверку условий - если поле
created_at
является GTE дляDATE_FORMAT(DATE_SUB(NOW(), INTERVAL 12 MONTH), '%Y-%m')
добавления строки к временной таблице, в противном случае это невнимание - Группа строк на основе производного столбца
m
- подсчета строк в каждой группе и поместить их в производный столбец
c
Если, мол, что я сказал выше, правильно, я обеспокоен точке 2. В типичной программе значение в выражении if будет вычисляться каждый раз, если не вводить переменную.
Должен ли я поставить оператор DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 12 MONTH), '%Y-%m')
в переменную и ссылку, что в моем предложении WHERE
, чтобы он не перерасчитывал его по каждой строке и как?
Я не уверен, что именно MySQL будет делать здесь. Казалось бы, вы создали строку, содержащую год и месяц, и сравниваете это с полем DATETIME. Если это так, то MySQL, вероятно, преобразует строку month/year в дату и время перед сравнением, которое должно выполнить ОК (при условии индекса на created_at). – Kickstart