Ваш запрос должен возвращать счет для всех рабочих мест для всех работодателей, но есть некоторые критерии, которые они должны соответствовать, чтобы появиться. Неявное соединение, поскольку вы используете, является INNER JOIN. Для этого необходимо, чтобы все критерии соответствовали, чтобы строки были включены. Это означает, что он возвращает только рабочие места, которые являются «isActive», «aActive», «status = 1» и createdAt менее 30 дней в прошлом, где работодатели «isActive» и «status = 1». Проверьте свои данные, чтобы убедиться, что это именно то, что вы хотите.
SELECT c.id AS employerID, count(*) as total
FROM employer as c, job as j
WHERE c.isActive=1 AND c.status=1
AND j.employerIDFK = c.id
AND j.isActive=1
AND j.beenActive=1
AND j.status=1
AND DATE_ADD(j.createdAt, INTERVAL 30 DAY) > NOW()
GROUP BY c.id
Насколько то, что другие пытаются сказать по поводу фильтра на createdAt, MySQL будет первым оценить NOW() (только один раз). Затем он добавляет 30 дней к каждой созданной дате, чтобы узнать, больше ли это, чем NOW(). MySQL иногда автоматически оптимизирует это, и это зависит от вашей версии и некоторых других факторов, но в целом выполнение функции против даты createdAt для каждой строки, чтобы сравнить ее с постоянным выражением, плохо, потому что MySQL не может использовать индекс на столбец createdAt.
Итак, вы должны преобразовать:
AND DATE_ADD(j.createdAt, INTERVAL 30 DAY) > NOW()
Для этого:
AND j.createdAt > DATE_ADD(NOW(), INTERVAL -30 DAY)
Это оставляет столбец j.createdAt как простой колонки, поэтому MySQL теперь может использовать любой индекс по отношению к колонке, чтобы найти даты, которые были менее 30 дней в прошлом.
Это эквивалент стояния в комнате со 100 людьми и просьба добавить 30 дней к их дню рождения, а затем спрашивать, какая дата расчета больше, чем сегодня. Вы только что сделали 100 человек. Вместо этого предварительно рассчитайте критерии, вычитая 30 дней с сегодняшней даты и просто спросите, больше ли день рождения у кого-то, чем эта дата. Вам нужно было сделать только один расчет, и он спас 100 человек от необходимости выполнять тяжелую работу.
Несколько вещей выпрыгнуть на меня по этому запросу. 1) Используйте правильные соединения. Неявные соединения вызывают массу проблем (я подозреваю, что это действительно связано с этим). 2) Предварительно рассчитайте СЕЙЧАС() - 30 дней, а затем используйте это значение для сравнения с j.createdAt. Таким образом, вы можете избежать полного сканирования таблицы (если j.createdAt проиндексирован). – Corbin
Мне нужно получить полный список вакансий, которые еще менее 30 дней. Я не знаю, что вы подразумеваете под Precalculate NOW()? – Lalajee
Поскольку значение NOW() постоянно изменяется, MySQL должен сравнивать пересчет его для каждой строки. Это означает, что даже без DATE_ADD потребуется полное сканирование таблицы. В принципе, у вас есть это: 'a + b
Corbin