【问题标题】:Proper way to get counts from multiple left joins [duplicate]从多个左连接中获取计数的正确方法[重复]
【发布时间】:2017-07-12 09:05:38
【问题描述】:

我正在尝试构建一个查询,该查询将从一个表中提取所有列,并从另一个相关表中添加一些计数,使用左连接从该表中查找与初始表中的每一列相关的项目。

到目前为止,我有这个:

SELECT table1.*,
       count(table2_c1.ID) as column1_count,
       count(table2_c2.ID) as column2_count
from table1
left join (select * from table2
           where table2.COLUMN_1 = 1) as table2_c1
    on table1.ID = table2_c1.TABLE1_ID
left join (select * from table2
           where table2.COLUMN_2 = 1) as table2_c2
    on table1.ID = table2_c2.TABLE1_ID
group by table1.ID
having ANOTHER_COLUMN = 1;

但这需要大约 5 秒的时间来执行,而且我还没有添加接近最终语句将包含的计数数量。有没有更好的方法来做到这一点?对于这个问题的解释如此糟糕,我深表歉意,我对 SQL 很陌生。

【问题讨论】:

  • [讽刺] 相当大的数据集每张表几千行在同一句话中并不严重。 [/sarcasm] 欢迎来到 SO 得到这样的性能问题的答案,最好显示你的表(包括索引)的 DDL,以及执行计划
  • @ThomasG heh,从问题中删除了该声明。不幸的是,由于表格中包含敏感数据,我无法真正分享有关表格的太多信息。

标签: mysql sql count left-join


【解决方案1】:

不用做双连接,改用case表达式做条件聚合:

SELECT table1.*,
       count(case when table2.COLUMN_1 = 1 then 1 end) as column1_count,
       count(case when table2.COLUMN_2 = 1 then 1 end) as column2_count
from table1
left join table2
    on table1.ID = table2.TABLE1_ID
group by table1.ID
having ANOTHER_COLUMN = 1;

【讨论】:

  • 太好了!谢谢,查询仍然比我想要的要长,但我猜这是不可避免的,因为数据集的大小和机器的性能。现在添加更多计数对执行时间的影响可以忽略不计,干杯。
  • 您可以尝试将AND (table2.COLUMN_1 = 1 OR table2.COLUMN_2 = 1) 添加到ON 子句中,看看会发生什么。
  • 对不起,也许这在另一个问题中会更好,但是当我将左连接添加到另一个表中,然后以您向我展示的相同方式从该表中获取计数时,它会导致原始计数不正确,知道我做错了什么吗?
猜你喜欢
  • 1970-01-01
  • 2012-06-15
  • 1970-01-01
  • 2018-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多