如何用SQL统计不同玩具持有量对应的雌性狗狗数量
现有查询问题说明
你当前的查询存在两处逻辑缺陷,无法支撑后续聚合统计:
- 关联条件错误:
WHERE子句中用toys.toy_id和雌性狗ID匹配,实际应该匹配toys.dog_id - 直接查询
toy表无法覆盖没有玩具的雌性狗(示例中id=3的母狗),必须从雌性狗表出发做左关联才能拿到0玩具的样本。
正确实现代码
SELECT num_toys, COUNT(dog_id) AS num_dogs FROM ( -- 先统计每只雌性狗的玩具持有数量 SELECT d.id AS dog_id, COUNT(t.toy_id) AS num_toys FROM dog d LEFT JOIN toy t ON d.id = t.dog_id WHERE d.gender = 2 GROUP BY d.id ) AS dog_toy_cnt -- 按玩具持有量分组统计对应狗的数量 GROUP BY num_toys ORDER BY num_toys;
逻辑说明
- 内层子查询先筛选所有雌性狗,左关联toy表,按狗ID分组统计每只狗的玩具数,没有玩具的狗统计结果自动为0
- 外层查询基于内层的单狗玩具数结果,按玩具数分组统计对应的狗的数量,输出结果和你给出的预期完全一致。
内容的提问来源于stack exchange,提问作者FinDev
相关产品推荐
相关产品推荐

