请帮忙。我正在使用MySQL 5.1.30社区版。
我有四个表:nts,operator,country,cooperationtype
我想得到运营商和国家/地区的数量,其中语音的所有价值都不等于'N / A',并通过contracttype.id将它们与此查询分组:
SELECT cooperationtype.id AS cooptype,
COUNT(DISTINCT country_id) AS country, COUNT(DISTINCT operatorId) AS operator
FROM nts INNER JOIN operator ON operator.id = nts.operatorId INNER JOIN country ON operator.country_id = country.id
INNER JOIN cooperationtype ON cooperationtype.id = nts.voice
WHERE cooperationtype.code <> 'N/A' GROUP BY cooperationtype.id
我得到了这个结果:
cooptype country operator 1 128 348 2 11 11 3 15 17
此查询的总和是154个国家和376个运营商。
但是当我想得到运营商和国家的所有数量,其中语音的所有价值都不等于'N / A'时,无论teamtype.id与此查询有关:
SELECT COUNT(DISTINCT country_id) AS country, COUNT(DISTINCT operatorId) AS operator
FROM nts INNER JOIN operator ON operator.id = nts.operatorId INNER JOIN country ON operator.country_id = country.id
INNER JOIN cooperationtype ON cooperationtype.id = nts.voice
WHERE cooperationtype.code <> 'N/A'
我得到了这个结果:
country operator 133 372
我的问题是:
数据示例:
voice country operator
1 US 1
1 US 2
1 UK 3
1 UK 4
2 US 1
2 US 2
对于第一个查询,数据应生成:
cooptype country operator
1 2 4
2 2 2
对于第二个查询,数据应生成:
country operator
2 4
答案 0 :(得分:3)
为什么第一个查询的结果总和不等于第二个查询的结果?
因为您使用COUNT(DISTINCT)
。
它按小组计算不同的记录。
您的第一个查询统计两个记录具有相同的国家/地区,但两次cooptype
不同(因为它按cooptype
分组),而第二个记录则计算一次。
哪一个是正确的结果?
两者都是对的。
对于给定的数据:
cooptype country
1 US
1 US
1 UK
1 UK
2 US
2 US
第一个查询将返回:
1 2
2 1
,第二个将返回
2
,因为你有:
2
cooptype = 1
(US
和UK
)中的不同国家/地区
{li> 1
cooptype = 2
(US
)中的不同国家/地区
2
个不同的国家(US
和UK
)“右”这个定义中的“正确”,取决于此定义。
如果您只想让第二个查询与第一个查询的结果相匹配,请使用
SELECT COUNT(DISTINCT cootype, country_id) AS country,
COUNT(DISTINCT cooptype, operatorId) AS operator
FROM nts
INNER JOIN
operator
ON operator.id = nts.operatorId
INNER JOIN
country
ON operator.country_id = country.id
INNER JOIN
cooperationtype
ON cooperationtype.id = nts.voice
WHERE cooperationtype.code <> 'N/A'
但是,这可能与您的第一个查询错误一样。
对于这些数据:
cooptype country operator
1 US 1
1 US 1
1 UK 2
1 UK 2
2 US 1
2 US 1
,什么是正确的结果集?