Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这个MySQL查询有什么问题?需要帮助才能理解吗_Mysql_Database - Fatal编程技术网

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

这个MySQL查询有什么问题?需要帮助才能理解吗,mysql,database,Mysql,Database,我有四张桌子 国家、州、城市、地区 除国家表外,其余三个(州、城市、地区)包含国家id外键 我想返回在我使用解决方案的三个表中合并的count of count_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外键

我想返回在我使用解决方案的三个表中合并的count of count_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(这是所有三个表中count number of country_id)

问题2:如果我 使用DISTINCT和删除DISTINCT? DISTINCT不应该删除任何 重复值。复制在哪里 这里发生了什么


谢谢.

举个例子,如果在一个国家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)。让我们在数据库表中可视化查询结果

C St Ct Ar


A->B->C->D

A->B->C->E

A->B->C->F

(这里C=国家,St=州,Ct=城市,Ar=地区)

现在想一想,当你依靠上表得到一个国家内没有明显差别的州的总数时会发生什么。结果是3,这样城市的数量是3,地区的数量是3,总数是9。因为没有明显差别,你会得到你不感兴趣的重复值

现在,如果您使用distinct count,您将得到正确的结果,因为这里的distinct状态在下面 国家A是1,城市是1,地区是3,总计:5(不包括重复值)

希望这能奏效

!!设计问题!!!
想补充一点:从您的数据库设计中,我可以看到您正在使用国家id作为国家的参考,从国家表(到州、地区和城市),然后连接州和城市,然后连接州和地区(通过国家id)。您不认为这是在创建交叉连接吗?更好的设计选择是在地区表中保留城市的外键,这种方法是自下而上的,就像在城市保留州和州保留国家一样。或者为保存国家、州、城市外键和地区主键的区域制作一个表。

例如,如果在国家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)。让我们在数据库表中可视化查询结果

C St Ct Ar


A->B->C->D

A->B->C->E

A->B->C->F

(这里C=国家,St=州,Ct=城市,Ar=地区)

现在想一想,当你依靠上表得到一个国家内没有明显差别的州的总数时会发生什么。结果是3,这样城市的数量是3,地区的数量是3,总数是9。因为没有明显差别,你会得到你不感兴趣的重复值

现在,如果您使用distinct count,您将得到正确的结果,因为这里的distinct状态在下面 国家A是1,城市是1,地区是3,总计:5(不包括重复值)

希望这能奏效

!!设计问题!!!
想补充一点:从您的数据库设计中,我可以看到您正在使用国家id作为国家的参考,从国家表(到州、地区和城市),然后连接州和城市,然后连接州和地区(通过国家id)。您不认为这是在创建交叉连接吗?更好的设计选择是在地区表中保留城市的外键,这种方法是自下而上的,就像在城市保留州和州保留国家一样。或者为保存国家、州、城市外键和地区主键的区域制作一张表。

是的,说得对,实际上我的想法是,如果我包括所有外键,例如国家id、州id,在areas表中输入city\u id,这样我可以最小化数据库查询行程,但我猜我错了,所以你建议我删除除一个外的所有外键吗?例如,对于areas表,仅输入city\u id就足够了,而对于state\u id,仅输入country\u id就足够了,对吗?是的,回答正确,实际上,我的想法是,如果我在区域表中包含所有外键,例如country\u id、state\u id、city\u id,那么这样我可以最小化数据库查询行程,但我猜我错了,所以,您是否建议我删除所有外键,除了一个,例如对于区域表,仅城市id就足够了,对于州id,仅国家id就足够了?