2009-06-03 10 views
1

J'essaie d'exécuter un rapport sur notre base de données. Nous voulons connaître les nouvelles inscriptions par industrie par mois. J'ai écrit cette requête:Problèmes avec MONTHNAME() sur MySQL 5

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()); 

Lorsque j'exécute cette requête, j'obtiens un jeu de résultats vide. Toutefois, si je cours ce qui suit:

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'; 

Il renvoie les résultats que je recherche.

Une aide s'il vous plaît? Je suis perplexe.

Mise à jour: la requête sera exécutée à la fin de chaque mois ou au début du mois suivant. Donc, nous sommes en juin, mais il faut que ça se passe en mai. J'espère que cela a du sens.

Répondre

1

Errr .... ce n'est pas peut o_O

Votre requête sera beaucoup plus efficace si vous écrivez comme ceci:

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) 

Vous ne devez utiliser PRESENTANT si vous devez absolument.

Il serait encore mieux si vous pouviez grouper par i.id au lieu de i.description, mais cela dépend si i.description est unique.

+1

Vous voyez ce que j'ai fait là-bas? : p – Greg

+0

Oh désolé Greg, je voulais dire Juin. Merci pour la réponse. Y at-il un moyen de rendre j.created_at automatisé car cette requête sera exécutée tous les mois via une console d'administration? – Midiane

+0

hey greg, le vôtre semble être le travail. est-il un moyen d'éviter les valeurs codées en dur pour j.created_at? – Midiane

2

Qu'est-ce que:

SELECT MONTHNAME(NOW()) 

Retour sur votre serveur?

+0

Juin. Désolé, faute de frappe ci-dessus, je vais modifier. – Midiane

0

Cette requête pourrait être mieux écrit:

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 

Le « avoir » l'article est appliqué après le regroupement; vous voudrez l'appliquer si vous voulez filtrer en fonction des résultats de l'agrégat (par exemple, obtenir toutes les industries où> 100 personnes ont postulé le mois dernier). Le regroupement par industry_id (que je suppose être la clé primaire) est plus rapide que le regroupement par une chaîne (industry_name et monthname). Et enfin, n'ont pas besoin de grouper par mois si vous ne sélectionnez qu'un seul mois. Cependant, vous devriez obtenir des données correctes, en supposant que votre tableau contient des informations sur le mois en cours.

+0

Salut todd merci pour votre contribution. J'ai essayé d'exécuter cette requête, mais elle a renvoyé un jeu de résultats vide. Des pensées? – Midiane

+0

Je viens de l'éditer. Parfois, vous obtenez des problèmes CAST entre les chiffres (2009) et les littéraux («2009»). C'est long, mais peut-être que le nouveau fonctionne? –

+0

Juste essayé. Ne pas. Bizarre ... continuera à essayer. – Midiane