phpMyAdmin使用子查询异常,SQL统计两表会员对应合计值所有行相同
问题排查及修复方案
问题根因
- 子查询未和外层的当前会员记录做关联,子查询内部过滤条件为全表匹配
Members a.uid = EV/PR b.uid,统计的是所有会员在对应表的总匹配数,而非当前行会员的单独计数,因此所有行的统计值都相同。 - 子查询内部不需要再次关联Members表,直接关联外层查询的会员UID即可。
修正后的SQL代码
SELECT c.FirstName, c.LastName, c.UID, -- 统计当前会员的EV记录数,无匹配时返回0 (SELECT COUNT(b.uid) FROM EV b WHERE b.uid = c.uid) AS Total_EV, -- 统计当前会员的PR记录数,无匹配时返回0 (SELECT COUNT(b.uid) FROM PR b WHERE b.uid = c.uid) AS TOTAL_PR FROM Members c -- 兼容SQL严格模式,所有非聚合字段都需加入GROUP BY GROUP BY c.UID, c.FirstName, c.LastName
补充优化方案
如果你的数据库支持关联聚合语法,可使用LEFT JOIN+聚合的方式实现,执行效率通常高于关联子查询:
SELECT c.FirstName, c.LastName, c.UID, -- EV表有主键则替换b.uid为EV表主键字段,避免重复计数 COUNT(b.uid) AS Total_EV, -- PR表有主键则替换p.uid为PR表主键字段,避免重复计数 COUNT(p.uid) AS TOTAL_PR FROM Members c LEFT JOIN EV b ON b.uid = c.uid LEFT JOIN PR p ON p.uid = c.uid GROUP BY c.UID, c.FirstName, c.LastName
内容的提问来源于stack exchange,提问作者nkum
相关产品推荐
相关产品推荐

