Mysql 左连接未返回所有结果

Mysql 左连接未返回所有结果,mysql,sql,count,left-join,aggregate-functions,Mysql,Sql,Count,Left Join,Aggregate Functions,我正在尝试连接下面的两个表,以显示事件表的所有列,以及事件表中事件id相同的tickets表中相应记录的计数 正如您在下面看到的,没有一张罚单指定了事件id。我查询的目标是显示事件表中的所有记录,以及分配给该记录单的记录单ID计数。我原以为这会起作用,但它只返回一行: SELECT inc.incident_id, inc.title, inc.date_opened, inc.date_closed, inc.status, inc.description, issue_type, COUNT

我正在尝试连接下面的两个表,以显示事件表的所有列,以及事件表中事件id相同的tickets表中相应记录的计数

正如您在下面看到的,没有一张罚单指定了事件id。我查询的目标是显示事件表中的所有记录,以及分配给该记录单的记录单ID计数。我原以为这会起作用,但它只返回一行:

SELECT inc.incident_id, inc.title, inc.date_opened, inc.date_closed, inc.status, inc.description, issue_type, COUNT(ticket_id) as example_count
FROM fin_incidents AS inc
LEFT OUTER JOIN fin_tickets ON inc.incident_id = fin_tickets.incident_id;
我可以使用什么查询返回所有事件及其票证计数,即使该计数为0

图像:

事件表 售票处 我的查询结果
您的查询根本不应该工作,并且在较新版本的MySQL中会失败。原因是缺少GROUP BY子句:


您有一个没有分组依据的聚合查询。这样的查询只返回一行,即使引用的表为空。

您的代码不是有效的聚合查询。在SELECT子句中有一个聚合函数用于计数,但没有GROUPBY子句。在sql模式下执行此操作时,仅禁用sql模式\u FULL\u GROUP\u,MySQL将为您提供一行,其中包含与事件相关的票证总数,以及事件行中的任何值。如果启用了该SQL模式,则会出现编译错误

我发现您想要的逻辑更简单,可以用相关子查询表示:

select i.*
    (select count(*) from fin_tickets t where t.incident_id = i.incident_id) as example_count
from fin_incidents i

此查询将利用fin_TicketCivent_id上的索引-如果您已经定义了应该定义的外键,则该索引已经存在。

没有分组依据?您的查询无效,所以不要期望它返回正确的结果。@philipxy,是吗?公认的答案正好相反。@jarlh我说,请参阅文档,公认的答案在开始时措词不当,在结束时明确同意我的观点,即一个人可以在没有分组的情况下进行聚合。整个表被视为一个组,输出特殊情况是空表仍然返回1行。这可以合理地描述为对空列集进行分组。公认的答案在第一段中描述的是另一个问题。在选择非分组列和非聚合列时,存在DBMS特定的限制。见文件。
select i.*
    (select count(*) from fin_tickets t where t.incident_id = i.incident_id) as example_count
from fin_incidents i