两个查询在同一个数据库中给出不同的结果

时间:2010-12-27 16:54:03

标签: mysql

请帮忙。我正在使用MySQL 5.1.30社区版。

我有四个表:nts,operator,country,cooperationtype

  • table`nts`有一列(`operatorId`),它是表`operator`中列`id`的外键和一列(`voice`),它是表中`id`列的外键cooperationtype
  • 表运算符有一列(`country_id`),它是表country中列(`id`)的外键

我想得到运营商和国家/地区的数量,其中语音的所有价值都不等于'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

我的问题是:

  1. 为什么第一个查询的结果总和不等于第二个查询的结果?
  2. 哪一个是正确的结果?
  3. 数据示例:

    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 
    

1 个答案:

答案 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

,因为你有:

    {li> 2 cooptype = 1USUK)中的不同国家/地区 {li> 1 cooptype = 2US)中的不同国家/地区
  • 2个不同的国家(USUK

“右”这个定义中的“正确”,取决于此定义。

如果您只想让第二个查询与第一个查询的结果相匹配,请使用

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

,什么是正确的结果集?