左连接不返回所有结果
Left join not returning all results
我正在尝试加入下面的两个 table 以显示事件 table 的所有列以及票证 table 中相应记录的计数incident_id 与事件 table 相同。
正如您在下面看到的,none 的工单尚未分配 incident_id。我查询的目标是显示事件 table 中的所有记录以及分配给该票证的 ticket_ids 的计数。我认为这行得通,但它 return 只有一行:
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;
我可以使用什么查询来 return 所有事件及其票数,即使该计数为 0?
图片:
- 事件Table
- 门票Table
- 我的查询结果
您的查询应该根本不起作用 -- 并且在 MySQL 的较新版本中会失败。原因是它缺少一个 GROUP BY
子句:
SELECT inc.incident_id, inc.title, inc.date_opened,
inc.date_closed, inc.status, inc.description, inc.issue_type,
COUNT(t.ticket_id) as example_count
FROM fin_incidents inc LEFT OUTER JOIN
fin_tickets t
ON inc.incident_id = t.incident_id
GROUP BY inc.incident_id, inc.title, inc.date_opened,
inc.date_closed, inc.status, inc.description, inc.issue_type
您有一个没有 GROUP BY
的聚合查询。这样的查询 returns 恰好一行,即使引用的表是空的。
您的代码不是有效的聚合查询。 SELECT
子句(COUNT()
)中有聚合函数,但没有 GROUP BY
子句。在禁用 sql 模式 ONLY_FULL_GROUP_BY
的情况下执行此操作时,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_tickets(incident_id)
上的索引 - 如果您定义了外键(您应该定义),则该索引已经存在。
我正在尝试加入下面的两个 table 以显示事件 table 的所有列以及票证 table 中相应记录的计数incident_id 与事件 table 相同。
正如您在下面看到的,none 的工单尚未分配 incident_id。我查询的目标是显示事件 table 中的所有记录以及分配给该票证的 ticket_ids 的计数。我认为这行得通,但它 return 只有一行:
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;
我可以使用什么查询来 return 所有事件及其票数,即使该计数为 0?
图片:
- 事件Table
- 门票Table
- 我的查询结果
您的查询应该根本不起作用 -- 并且在 MySQL 的较新版本中会失败。原因是它缺少一个 GROUP BY
子句:
SELECT inc.incident_id, inc.title, inc.date_opened,
inc.date_closed, inc.status, inc.description, inc.issue_type,
COUNT(t.ticket_id) as example_count
FROM fin_incidents inc LEFT OUTER JOIN
fin_tickets t
ON inc.incident_id = t.incident_id
GROUP BY inc.incident_id, inc.title, inc.date_opened,
inc.date_closed, inc.status, inc.description, inc.issue_type
您有一个没有 GROUP BY
的聚合查询。这样的查询 returns 恰好一行,即使引用的表是空的。
您的代码不是有效的聚合查询。 SELECT
子句(COUNT()
)中有聚合函数,但没有 GROUP BY
子句。在禁用 sql 模式 ONLY_FULL_GROUP_BY
的情况下执行此操作时,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_tickets(incident_id)
上的索引 - 如果您定义了外键(您应该定义),则该索引已经存在。