Mysql 从多个左联接获取计数的正确方法
我正在尝试构建一个查询,该查询将从一个表中提取所有列,还将从另一个相关表中添加一些计数,使用左联接从该表中查找与初始表中的每个列相关的项 到目前为止,我有:Mysql 从多个左联接获取计数的正确方法,mysql,sql,count,left-join,Mysql,Sql,Count,Left Join,我正在尝试构建一个查询,该查询将从一个表中提取所有列,还将从另一个相关表中添加一些计数,使用左联接从该表中查找与初始表中的每个列相关的项 到目前为止,我有: SELECT table1.*, count(table2_c1.ID) as column1_count, count(table2_c2.ID) as column2_count from table1 left join (select * from table2 where tabl
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还比较陌生。不需要进行双连接,而是使用
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;
无需执行双重联接,请使用
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;
[讽刺]相当大的数据集和每个表几千行在同一句话中并不严重。[/sarcasm]欢迎来到SO,为了得到关于这样的性能问题的答案,最好显示表的DDL(包括索引)和执行plan@ThomasG嘿,把那句话从问题中删除了。不幸的是,由于表中包含的敏感数据,我无法真正共享关于这些表的很多信息。[讽刺]相当大的数据集和每个表几千行在同一句话中并不重要。[/sarcasm]欢迎来到SO,为了得到关于这样的性能问题的答案,最好显示表的DDL(包括索引)和执行plan@ThomasG嘿,把那句话从问题中删除了。不幸的是,由于表中包含的敏感数据,我无法真正共享有关表的很多信息。太棒了!谢谢,查询仍然需要比我希望的更长的时间,但我猜这是不可避免的,因为数据集的大小和机器的性能。现在添加更多计数对执行时间的影响可以忽略不计,干杯。您可以尝试将
和(table2.COLUMN_1=1或table2.COLUMN_2=1)
添加到ON
子句中,看看会发生什么。抱歉,在另一个问题中,这可能会更好,但当我将左连接添加到另一个表时,然后用你给我看的方法从那张表中得到一个计数,结果是原来的计数不正确,你知道我可能做错了什么吗?太好了!谢谢,查询仍然需要比我希望的更长的时间,但我猜这是不可避免的,因为数据集的大小和机器的性能。现在添加更多计数对执行时间的影响可以忽略不计,干杯。您可以尝试将和(table2.COLUMN_1=1或table2.COLUMN_2=1)
添加到ON
子句中,看看会发生什么。抱歉,在另一个问题中,这可能会更好,但当我将左连接添加到另一个表时,然后从那张表中得到一个计数,就像你给我看的一样,结果是原来的计数不正确,你知道我可能做错了什么吗?