我有以下 SQL 代码:
SELECT widgets.campaign_name, widgets.enddate, widgets.active,
widgets.id_widget,COUNT(*) AS entries
FROM widgets
LEFT JOIN entries ON widgets.id_widget = entries.id_widget
WHERE widgets.active IN ( 0 )
AND id_user = 8
GROUP BY widgets.campaign_name
除了一件事之外,它做的正是我想做的。如果我在活动中有 0 个条目,它仍然显示 1 个条目。我想摆脱这个问题,让它准确地计算出有多少条目。如果为 0,则应显示 0。
上面的代码适用于 1,2....n 个条目。
问题是外连接
NULL
在(右)表的列中为左表中没有匹配的行生成值。因此,您应该使用COUNT(entries.id_widget)
which counts not null values in that column 而不是COUNT(*)
which counts rows。更多注意事项:
widget.id_user
)或别名(w.id_user
)。否则,如果稍后在表中添加具有相同名称的列,查询将中断entries
。campaign_name
是主键widgets
或者有唯一约束,否则你不应该使用GROUP BY
这种方式。列表中的所有列SELECT
都应在聚合函数中使用或出现在GROUP BY
列表中。MySQL 不进行此类检查,不遵循此规则的查询可能会返回不确定的结果。如果列 (in
SELECT
) 依赖于列GROUP BY
(在这种情况下,如果campaign_name
有唯一约束,那将是正确的),这是一个例外,结果将是确定的,您可以使用 MySQL 的这一“功能”。ONLY_FULL_GROUP_BY
如果你想使用它,你还应该检查设置是否被禁用。有关详细信息,请阅读 MySQL 文档:GROUP BY 的 MySQL 扩展以及此处的讨论:为什么 MySQL 会添加与 SQL 标准冲突的功能?.
查询变为: