我有4张桌子,
国家,州,城市,地区,
除了国家表外,其余三个(州,城市,地区)包含country_id外键。
我想返回我使用jon_darstar's解决方案的三个表中的country_id总数,这是我正在使用的代码。
SELECT COUNT(DISTINCT(states.id)) + COUNT(DISTINCT(cities.id)) + COUNT(DISTINCT(areas.id))
FROM states
JOIN cities on cities.country_id = states.country_id
JOIN areas on areas.country_id = states.country_id
WHERE states.country_id IN (118);
上面的代码完全正常,虽然我无法正确理解代码,主要是第一行,即
SELECT COUNT(DISTINCT(states.id)) + COUNT(DISTINCT(cities.id)) + COUNT(DISTINCT(areas.id))
问题1:不选择 三个表的主要ID 国家,城市和地区,并制定 计数?我知道这不会发生 从结果我得到什么 实际上发生在这里?
但是,如果我从查询字符串中删除DISTINCT,它会向我显示不同的结果,即计数为120,而实际上它应该是15(这是所有三个表中country_id的计数)。
谢谢..问题2:如果我发生了什么事 使用DISTINCT并删除DISTINCT? 不是DISTINCT应该删除任何 重复的值。哪里是重复 发生在这里?
答案 0 :(得分:4)
例如,如果在国家A(主要ID为a.id = 118)中,则存在状态B(具有主要ID为b.id),在该状态内存在城市C(具有主要ID c.id) ),在城市C中有区域D(具有主要ID d.id),E(具有主要ID e.id),F(f.id).lets在数据库表中可视化查询结果。
C St Ct Ar
A-> B-> C-> d
A-> B-> C-&GT,E
A-> B-> C->˚F
(此处C =国家,St =州,Ct =城市,Ar =地区)
现在想想当你依靠上表来获得国家A中的国家总数而没有区别时会发生什么。结果是3,这样城市的数量是3,区域是3,总共9。因为没有不同的是你得到了你不感兴趣的重复值。
现在,如果您使用不同的计数,您将得到正确的结果,因为这里的不同状态 国家A是1,城市是1,区域是3,总数:5(不包括重复值)..
希望这有效!
喜欢添加一些内容:从您的数据库设计中,我可以看到您使用国家/地区ID作为国家/地区(到州,地区和城市)的国家/地区的参考,然后加入州和城市,然后是州和地区(按他们的国家ID)你认为它不是在创造交叉加入吗?。更好的设计选择是在城市保留外键的区域表,这种方式像城市保持状态一样自下而上保持国家。或者为区域制作一张桌子你在哪里保持国家,国家,城市的外键和地区的主要关键。