6

月の名前と特定の月のレコード数を選択する12行(各月に1行)を返すクエリをmysqlで作成する必要があります。私は2つのテーブル、months_tblとevents_tblを持っています。events_tblの各レコードには、datetime列とcompany_id列があります。

私は現在次のようなことをしています(WHERE company_id句がまだないことに注意してください):

SELECT months_tbl.month, COUNT( events_tbl.event_id ) cnt
FROM months_tbl
LEFT JOIN events_tbl ON months_tbl.month_id = MONTH( events_tbl.appt_date_time )
GROUP BY months_tbl.month
ORDER BY months_tbl.month_id ASC;

これは、私が期待しているもののようなものを返します(12行が選択され、その月のイベントの数、またはイベントがなかった場合はゼロ):

**month**    **cnt**
January      0
February     0
March        0
April        0
May          0
June         0
July         0
August       88
September    99
October      120
November     0
December     9

ただし、会社に関係なくすべてのレコードが返されます。クエリがフィルターされていることを確認する必要があるので、where句を追加しました。

SELECT months_tbl.month, COUNT( events_tbl.appt_id ) cnt
FROM months_tbl
LEFT JOIN events_tbl ON months_tbl.month_id = MONTH( events_tbl.appt_date_time ) 
WHERE events_tbl.company_id = 1 
GROUP BY months_tbl.month
ORDER BY months_tbl.month_id ASC;

where句を追加すると、結果は次のようになります。

**month**    **cnt**
August       88
September    99
October      120
December     9

左結合を使用しているのに、where句を追加すると、他のすべての月のレコードが失われる理由はありますか?

4

1 に答える 1

6

を使用してLEFT JOINいますが、whereステートメントで「通常」にしていますJOIN

次のように書いてみてください。

SELECT months_tbl.month, COUNT( events_tbl.appt_id ) cnt
FROM months_tbl
  LEFT JOIN events_tbl ON (months_tbl.month_id = MONTH(events_tbl.appt_date_time) 
    AND events_tbl.company_id = 1
  )
GROUP BY months_tbl.month
ORDER BY months_tbl.month_id ASC;

にあることに注意してAND events_tbl.company_id = 1くださいLEFT JOIN

于 2012-08-07T07:59:03.827 に答える