2009-06-03 3 views
1

私たちのデータベースでレポートを実行しようとしています。 1か月あたりの業界ごとの新規登録を知りたい。私はこのクエリを書いた:MySQL 5のMONTHNAME()に関する問題

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

私が探している結果を返します。

お願いします。私は困惑している。

更新:このクエリは、毎月の終わりまたは過去1か月の次の開始日に実行されます。だから今は6月ですが、5月に走る必要があります。希望は意味をなさない。

答えて

1

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.descriptionではなくi.idでグループ化することができますが、i.descriptionが一意であるかどうかによって異なります。

+1

私がそこで何を見ましたか? :p – Greg

+0

ああ、申し訳ありませんグレッグ、私は6月を言いたいと思いました。 お返事ありがとうございます。 j.created_atを自動化する方法はありますか?このクエリーは管理コンソールから毎月実行されますか? – Midiane

+0

ねえ、あなた達は働いているようです。 j.created_atのハードコードされた値を避ける方法はありますか? – Midiane

2

何:サーバー上

SELECT MONTHNAME(NOW()) 

戻りますか?あなたはこのようにそれを書いた場合

+0

6月。申し訳ありません、上記の入力ミス、私は編集します。 – Midiane

0

このクエリは、より良い書き込むことができます。

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 

句は、グループ化後に適用される「有します」。集計の結果に基づいてフィルタリングする場合(たとえば、先月100人以上が参加したすべての業種を取得する場合など)に適用することをお勧めします。 industry_id(主キーと見なしている)によるグループ化は、文字列(industry_nameとmonthname)でグループ化するよりも高速です。最後に、1か月だけを選択している場合は、月単位でグループ化する必要はありません。

ただし、テーブルに実際の現在の月の情報があると仮定すると、正しいデータが得られるはずです。

+0

こんにちは あなたの貢献に感謝します。私はそのクエリを実行しようとしましたが、空の結果セットを返しました。何かご意見は? – Midiane

+0

ただそれを編集しました。場合によっては、数字(2009)とリテラル(2009)の間でCASTの問題が発生することがあります。ロングショットですが、おそらく新しい作品ですか? –

+0

ちょうど試しました。 doesnt。奇妙なことを続けよう。 – Midiane

関連する問題