【问题标题】:How to select count() if there is a value but select nothing if the value is 0如果有值如何选择count()但如果值为0则不选择任何内容
【发布时间】:2019-08-14 09:33:17
【问题描述】:

我正在为一个项目编写一个预订系统,目前正在努力内置一些报告功能。我需要返回今天日期所有课程的列表,无论他们是否有预订。

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

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

以上代码仅在有人预订课程时有效。当班级没有预定的成员时不会。

我仍然得到返回为 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 |
+-----------------------+------------+-----------+-----------------+----------------+----------------------------+

【问题讨论】:

  • 从不在 FROM 子句中使用逗号。 始终使用正确、明确、标准 JOIN 语法。
  • 老实说,我对使用 join 语法的 sql 很陌生,你知道我将如何将其转换为 join 吗?
  • 我仍然得到返回为 0 的计数,但其他列没有其他结果如果没有预订,应该还有什么其他结果?
  • @Lksimo 。 . .你甚至不应该学习在FROM 子句中使用逗号。你应该只学习JOIN。有很多在线和离线学习 SQL 的资源。
  • 欢迎来到 Stack Overflow。我知道您是该网站的新手,所以如果可以的话,我会提供一些建议。首先,您的问题实际上非常好 - 但请不要将示例数据作为图像发布。相反,将它作为文本包含在问题中,这样人们就可以使用它而不必重新输入所有内容——我们大多数人都不会这样做。其次,甚至更好的是,访问 SQL 测试站点,例如 sqlfiddle.com 或 dbfiddle.uk,设置您的表并用数据填充它们,然后人们可以使用它来帮助您找到问题的解决方案.祝你好运。

标签: mysql sql mysql-python


【解决方案1】:

如果您还想要不预订,您需要左加入(外部)加入

你应该避免旧的基于位置的隐式连接sintax,你应该使用显式连接sintax并使用这个使用左连接进行预订

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

【讨论】:

  • 当没有像我需要的预订时,这会返回每个字段的信息,但是它只返回一个实例,而今天的数据库中有两个?
  • 我不在你的数据中......所以更新你的问题......添加一个适当的(清晰的)数据样本。和预期的结果 .as 表格文本
  • 添加了数据集的图像,我也从您的查询中得到了这个 - imgur.com/R5sePQg 感谢您的帮助
  • 好吧,也许我解释得不够清楚,就在 stackoverflow 上发帖而言,我对此很陌生。基本上我有一堆类(class.instances),我想显示今天发生的所有类及其信息。除此之外,我还需要查看总共有多少人预订了该课程,这是根据该实例 id 的预订数量计算得出的
  • 您的评论和您的问题对于预期结果尚不清楚,因此如果您添加具有预期结果的文本示例,则比文字更好..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-30
  • 1970-01-01
  • 2016-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多