如何访问不同表元素?宠物前后门店同国统计SQL疑问
现有表结构
pets表
| 动物 | prev_store | curr_store |
|---|---|---|
| 猫 | ABC | DEF |
| 狗 | ABC | GHI |
| 鱼 | DEF | XYZ |
| 蛇 | XYZ | JKM |
pet_store表
| 门店 | Country |
|---|---|
| ABC | England |
| DEF | Denmark |
| GHI | England |
| XYZ | Denmark |
| JKM | Denmark |
需求说明
检查pets表中每个动物的prev_store和curr_store是否属于同一国家,若是则统计该国家的出现次数,预期结果:
| Country | 出现次数 |
|---|---|
| England | 1 |
| Denmark | 2 |
原SQL问题分析
你写的SQL中,pets.prev_store = pet_store.Store and pets.curr_store = pet_store.Store这个条件要求prev_store和curr_store必须是同一个门店,这和需求不符——我们需要的是两个门店归属同一国家,而非同一个门店。
正确SQL写法
需要两次关联pet_store表,分别获取prev_store和curr_store对应的国家,筛选出两国相同的记录后再统计次数:
SELECT ps_prev.Country, COUNT(*) AS 出现次数 FROM pets JOIN pet_store ps_prev ON pets.prev_store = ps_prev.门店 JOIN pet_store ps_curr ON pets.curr_store = ps_curr.门店 WHERE ps_prev.Country = ps_curr.Country GROUP BY ps_prev.Country;
逻辑解释
- 第一次关联
pet_store(别名ps_prev),获取每个动物prev_store对应的国家; - 第二次关联
pet_store(别名ps_curr),获取每个动物curr_store对应的国家; - 通过
WHERE条件筛选出两个国家相同的记录; - 按国家分组,用
COUNT(*)统计每个国家符合条件的动物数量。
内容的提问来源于stack exchange,提问作者Zera K
相关产品推荐
相关产品推荐

