如果在某些情况下SQL中没有值,计数显示零。

时间:2019-02-19 07:52:55

标签: sql mysqli

我有两个表,一个是事件,第二个是注册。 我已将活动或过去的活动详细信息存储在“我的事件”表中。

第一个事件表:

*-----------------------------------------------------*
| Event_id | Event_name |  Event_end_date  |  Status  |
*-----------------------------------------------------*
|   E001   |    AHM     | 2019-02-05 10:00 |   Past   |
|   E002   |    JPS     | 2019-03-14 10:00 |  Active  |
|   E003   |    AHM     | 2019-02-05 10:00 |  Active  |
*-----------------------------------------------------*

第二张注册信息表:

*------------------------------------*
| R_no | Event_id |   booking_date   |
*------------------------------------*
|  101 |   E001   | 2019-02-01 17:00 |
|  102 |   E001   | 2018-11-19 18:50 |
|  101 |   E002   | 2018-12-09 14:00 |
|  102 |   E002   | 2019-01-25 08:50 |
|  103 |   E002   | 2019-02-05 18:00 |
|  101 |   E003   | 2019-02-08 10:00 |
|  102 |   E003   | 2019-02-10 13:00 |
|  103 |   E003   | 2019-02-12 14:50 |
|  104 |   E003   | 2019-02-14 16:00 |
*------------------------------------*

现在我想要事件E003的输出如下,请注意,在2018年12月和2019年1月没有预订E003,但根据登记表,有一个活动事件E002和2018年的一些票簿-Dec和2019-Jan,这取决于event_end_date。

*-----------------*
|  Month  | Count |
*-----------------*
| 2018-12 |   0   |
| 2019-01 |   0   |
| 2019-02 |   4   |
*-----------------*

我能够获得2019-02的计数,但不能获得12月和1月的计数。我正在使用以下查询:

SELECT DATE_FORMAT(booking_date, "%Y-%m") As month, count(event_id) AS count FROM registration LEFT JOIN events ON registration.event_id = events.event_id WHERE registration.event_id = 'E003' GROUP BY registration.event_id

因此,我可以对查询进行任何更新,以便获得输出。

3 个答案:

答案 0 :(得分:0)

您可以将correlated subquerynot exists一起使用

SELECT DATE_FORMAT(booking_date, "%Y-%m") As month, count(event_id) AS count 
FROM registration LEFT JOIN events ON registration.event_id = events.event_id 
WHERE registration.event_id = 'E003' and not exists
(select 1 from registration b where registration.event_id=b.event_id and Status='Past')
GROUP BY registration.event_id

答案 1 :(得分:0)

下面是查询-

select
t1.book_year_month, count(*) FROM events t1 LEFT OUTER JOIN 
( 
                SELECT DISTINCT from_unixtime(unix_timestamp(booking_date), '%Y-%m') book_year_month, 
                                booking_date from events) t2 ON t2.booking_date<=t1.event_end_date GROUP BY t2.book_year_month;

答案 2 :(得分:0)

如果我理解正确,则可以使用LEFT JOIN并进行如下过滤:

SELECT DATE_FORMAT(booking_date, '%Y-%m') As month,  
       COUNT(event_id) AS count
FROM registration r LEFT JOIN
     events e
     ON e.event_id = r.event_id AND
        e.event_id = 'E003'
GROUP BY DATE_FORMAT(booking_date, '%Y-%m');