这个MySQL查询有什么问题?需要帮助才能理解

时间:2011-04-05 15:36:17

标签: mysql database

我有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应该删除任何   重复的值。哪里是重复   发生在这里?

谢谢..

1 个答案:

答案 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)你认为它不是在创造交叉加入吗?。更好的设计选择是在城市保留外键的区域表,这种方式像城市保持状态一样自下而上保持国家。或者为区域制作一张桌子你在哪里保持国家,国家,城市的外键和地区的主要关键。