Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 从多个左联接获取计数的正确方法_Mysql_Sql_Count_Left Join - Fatal编程技术网

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
子句中,看看会发生什么。抱歉,在另一个问题中,这可能会更好,但当我将左连接添加到另一个表时,然后从那张表中得到一个计数,就像你给我看的一样,结果是原来的计数不正确,你知道我可能做错了什么吗?