如何在子查询SELECT语句中正确使用父表属性?
如何在子查询的SELECT语句中使用父表的属性
问题原因
你写的子查询里,records.parent_id = parent_id存在字段歧义——两个parent_id都指向子查询内部的records表字段,导致条件恒成立,最终统计了所有记录的总数。要引用父表的字段,必须给父表指定别名,明确区分层级。
解决方案
给父表Record设置别名(比如r),在子查询中通过别名引用父表的id字段,同时给统计结果指定别名total,方便后续获取数据:
Record.select('name, (SELECT COUNT(*) FROM records WHERE records.parent_id = r.id) AS total').from('records AS r')
如果用ActiveRecord的链式写法更直观:
Record.select(:name, Record.select('COUNT(*)').where('records.parent_id = records.id').as('total'))
结果验证
针对你的示例数据,执行上述查询后会得到预期结果:
[{name: 'Test A', total: 2}, {name: 'Test B', total: 2}, {name: 'Test C', total: 1}]
补充说明
- 当子查询和父表使用同一张表时,必须通过别名区分表层级,否则数据库无法识别你要引用的是父表还是子查询内的表字段。
- 你的示例逻辑是统计包含自身在内的所有关联节点(比如Test A的
parent_id等于自己的id,所以统计到自身和Test B),如果只需要统计直接子节点,保持条件逻辑即可,当前写法完全匹配你的需求。
内容的提问来源于stack exchange,提问作者Jovanny Israel Zepeda Roque
相关产品推荐
相关产品推荐

