如果有值,如何 select count() 但如果值为 0,如何 select 没有

How to select count() if there is a value but select nothing if the value is 0

我正在为一个项目编写一个预订系统,目前正在努力获取一些内置的报告功能。我需要return列出今天日期的所有 classes,无论他们是否有预订与否。

我遇到的问题是,当没有预订时,我不会从 sql 查询中得到任何回复,但是当有预订时,我会得到正确的信息。如果我将预订计数从 select 中剔除,那么一切正常,但我需要所有这些信息。

SELECT
    class_instances.instance_sdate,
    classes.class_name,
    classes.class_max,
    users.user_name_first,
    users.user_name_last,
    COUNT(bookings.booking_id)
FROM
    `computing-project`.class_instances class_instances,
    `computing-project`.classes classes,
    `computing-project`.users users,
    `computing-project`.bookings bookings
WHERE
    DATE(class_instances.instance_sdate) = DATE(NOW()) AND
    class_instances.class_id = classes.class_id AND
    classes.teacher_id = users.user_id AND
    bookings.instance_id = class_instances.instance_id

数据集:https://imgur.com/JDjkK0G

以上代码仅在有人预订 class 时有效。当 class 没有预订会员时不会。

我仍然得到计数 returned 为 0 但其他列没有其他结果

预期输出

+-----------------------+------------+-----------+-----------------+----------------+----------------------------+
|    instance_sdate     | class_name | class_max | user_name_first | user_name_last | count(bookings.booking_id) |
+-----------------------+------------+-----------+-----------------+----------------+----------------------------+
| 2019-03-23 16:38:00.0 | Test       |        11 | Louis           | Simpson        |                          0 |
| 2019-03-23 16:39:00.0 | Test2      |        12 | Louis           | Simpson        |                          0 |
+-----------------------+------------+-----------+-----------------+----------------+----------------------------+

如果您还想要不预订,则需要左连接(外部)连接

您应该避免基于 where 的旧隐式连接语法,您应该使用显式连接语法并使用此使用左连接进行预订

SELECT
    class_instances.instance_sdate,
    classes.class_name,
    classes.class_max,
    users.user_name_first,
    users.user_name_last,
    COUNT(bookings.booking_id)
FROM `computing-project`.class_instances class_instances
INNER JOIN  `computing-project`.classes classes ON class_instances.class_id = classes.class_id 
INNER JOIN  `computing-project`.users users ON  classes.teacher_id = users.user_id 
LEFT  JOIN  `computing-project`.bookings bookings ON bookings.instance_id = class_instances.instance_id 
WHERE  DATE(class_instances.instance_sdate) = DATE(NOW())
GROUP BY  class_instances.instance_sdate,
    classes.class_name,
    classes.class_max,
    users.user_name_first,
    users.user_name_last