我无法使该查询生效:
不起作用
select
Region.*, count(secteur.*) count
from
Region
left join
secteur on secteur.region_id = Region.id
我找到的解决方案是这个,但是有没有使用联接的更好解决方案,或者如果这不影响性能,因为我有一个非常大的数据集,大约有50万行
工作却避免了性能问题
select
Region.*,
(select count(*)
from Secteur
where Secteur.Region_id = region.id) count
from
Region
答案 0 :(得分:2)
我建议:
SELECT r.*, COALESCE(s.cnt, 0)
FROM region r
LEFT JOIN (SELECT region_id, COUNT(*) AS cnt
FROM secteur
GROUP BY region_id) s ON s.region_id = r.id
请注意,select region.*, count(secteur.region_id) as count
from region left join secteur on region.id = secteur.region_id
group by region.id, region.field2, region.field3....
将忽略空值,而count(table.field)
将包含它们。
或者,在子查询上左联接,并使用count(*)
避免为空:
coalesce
答案 1 :(得分:1)
我将在error_reporting(E_ALL);
ini_set('display_errors', 1);
的汇总查询中加入region
:
secteur
答案 2 :(得分:1)
我会使用以下查询:
select r.*,
(select count(*)
from Secteur s
where s.Region_id = r.id
) as num_secteurs
from Region r;
然后通过在Secteur(region_id)
上添加索引来解决性能问题:
create index idx_secteur_region on secteur(region_id);
答案 3 :(得分:0)
您犯了两个错误
Region.region_id, count(*) AS count
,并且不要忘记在GROUP BY
步骤中添加Region.region_id。select Region.*
,但没有在GROUP BY
步骤中定义它们。您需要将在GROUP BY
步骤中定义的所有列添加到SELECT
语句中,但不对它们应用聚合函数。GROUP BY Region.*
无效,您应该在GROUP BY
步骤中按其实际名称定义一列。所以,正确的形式看起来像
SELECT
Region.col1
,Region.col2,
, count(*) count
from Region
left join
secteur on secteur.region_id = Region.id
GROUP BY Region.col1, Region.col2
或者,如果您不想键入列的每个名称,请使用窗口查询
SELECT
Region.*,
, count( * ) OVER (PARTITION BY region_id) AS count
from Region
left join
secteur on secteur.region_id = Region.id