Проблемы с MONTHNAME () на MySQL 5 - PullRequest
1 голос
/ 03 июня 2009

Я пытаюсь запустить отчет в нашей базе данных. Мы хотим знать новые регистрации по отраслям в месяц. Я написал этот запрос:

SELECT 
  COUNT(j.jobseeker_id) as new_registrations, 
  i.description as industry_name,
  MONTHNAME(j.created_at)
FROM
  tb_jobseeker as j, tb_industry as i
WHERE 
  YEAR(j.created_at) = 2009 
AND 
  i.industry_id = j.industry_id 
GROUP BY 
  i.description, MONTHNAME(j.created_at)
HAVING
  MONTHNAME(j.created_at) =  MONTHNAME(NOW());

Когда я запускаю этот запрос, я получаю пустой набор результатов. Тем не менее, если я запускаю следующее:

SELECT 
  COUNT(j.seeker_id) as new_registrations, 
  i.description as industry_name,
  MONTHNAME(j.created_at)
FROM
  tb_seeker as j, tb_industry as i
WHERE 
  YEAR(j.created_at) = 2009 
AND 
  i.industry_id = j.industry_id 
GROUP BY 
  i.description, MONTHNAME(j.created_at)
HAVING
  MONTHNAME(j.created_at) =  'June';

Возвращает результаты, которые я ищу.

Любая помощь, пожалуйста? Я в тупике.

Обновление: запрос будет выполняться в конце каждого месяца или в начале следующего за последний месяц. Итак, мы сейчас в июне, но он должен быть запущен на май. Надеюсь, что это имеет смысл.

Ответы [ 3 ]

2 голосов
/ 03 июня 2009

Что значит:

SELECT MONTHNAME(NOW())

Вернуться на свой сервер?

1 голос
/ 03 июня 2009

Errr .... это не май O_o

Ваш запрос будет намного эффективнее, если вы напишите его так:

SELECT 
  COUNT(j.jobseeker_id) as new_registrations, 
  i.description as industry_name,
  MONTHNAME(j.created_at)
FROM
  tb_jobseeker as j, tb_industry as i
WHERE 
  j.created_at BETWEEN '2009-05-01' AND '2009-05-31'
AND 
  i.industry_id = j.industry_id 
GROUP BY 
  i.description, MONTH(j.created_at)

Вы должны использовать HAVING, только если вам абсолютно НУЖНО.

Было бы еще лучше, если бы вы могли группировать по i.id вместо i.description, но это зависит от того, является ли i.description уникальным.

0 голосов
/ 03 июня 2009

Этот запрос можно написать лучше:

SELECT 
 COUNT(j.jobseeker_id) as new_registrations, 
 i.description as industry_name,
 MONTHNAME(j.created_at)
FROM
  tb_jobseeker as j, tb_industry as i
WHERE 
  YEAR(j.created_at) = YEAR(NOW())
  AND MONTH(j.created_at) =  MONTH(NOW())
  AND i.industry_id = j.industry_id 
GROUP BY 
  i.industry_id

Предложение "HAVING" применяется после группировки; Вы хотели бы применить его, если хотите фильтровать на основе результатов совокупности (например, получить все отрасли, где в прошлом месяце было подано> 100 человек). Группировка по industry_id (я предполагаю, что это первичный ключ) выполняется быстрее, чем группировка по строке (industry_name и monthname). И, наконец, не нужно группировать по месяцам, если вы выбираете только один месяц.

Однако вы должны получать правильные данные, предполагая, что ваша таблица содержит информацию за текущий текущий месяц.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...