如果有值,如何 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
以上代码仅在有人预订 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
我正在为一个项目编写一个预订系统,目前正在努力获取一些内置的报告功能。我需要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
以上代码仅在有人预订 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