显示不构成查询一部分的国家 - mysql

时间:2015-02-05 21:01:37

标签: mysql

所以我有这个问题,我必须在哪里显示不属于组织的名称或国家' WHO'在表中是成员。这是我提出的SQL

SELECT DISTINCT ismember.country, country.name
FROM ismember LEFT JOIN country ON ismember.country = country.code
WHERE ismember.organization NOT IN (
    SELECT DISTINCT ismember.organization
    FROM ismember
    WHERE ismember.organization = 'WHO'
)
GROUP BY organization 
HAVING COUNT(organization) > 1 ;

它有效,它确实返回了不在世界卫生组织的国家。我的问题是,这种方法排除了没有组织的国家。 I.E它排除那些没有参加成员表的国家。

任何想法如何解决这个问题

3 个答案:

答案 0 :(得分:1)

为什么不这样呢?

SELECT code, name FROM country WHERE code NOT IN (
    SELECT country FROM ismember WHERE organization = 'WHO'
)

应该做同样的事情。 :)

答案 1 :(得分:0)

解决此问题的一种方法是使用聚合和having子句:

SELECT im.country, c.name
FROM ismember im LEFT JOIN
     country c
     ON im.country = c.code
GROUP BY m.country, c.name
HAVING SUM(im.organization = 'WHO') = 0;

答案 2 :(得分:0)

这不是答案,而是解释您的查询的作用:

  1. 子查询

    SELECT DISTINCT ismember.organization FROM ismember WHmember ismember.organization ='WHO'

  2. 对于组织为“WHO”的表格中的每条记录,都会获得字符串“WHO”,然后将所有“WHO”减少为“WHO”。

    1. 不在
    2. 因此WHERE ismember.organization NOT IN (subquery)WHERE ismember.organization <> 'WHO'

      相同
      1. LEFT JOIN
      2. 你左外加入表国家ismember。这意味着如果成员包含一个不在国家/地区表中的国家/地区,您仍然可以获得该记录。但为什么一个国家不在国家表中呢?这似乎没有意义。你可能得到像123, NULL这样的记录,这意味着国家代码123不是有效的国家,但是到底是什么?

        1. GROUP BY
        2. 您按组织分组。因此,每个组织可以获得一个结果行。你不是说你希望国家上市吗?

          1. 聚合
          2. 然后为每个组织选择ismember.country和country.name。由于您未指定任何所需的聚合(如MAX(ismember.country)或MIN(country.name)),因此您将获得随机匹配。因此,如果有一个组织'ABC'与国家1,2和3,你会随机获得三个中的一个。

            1. HAVING
            2. HAVING COUNT(organization)HAVING COUNT(*)大致相同,即每个组织的国家/地区数量。确切地说:对于非空的所有组织都是相同的(对于null,第一个表达式得到0,第二个表达式得到国家计数)。您希望组织的国家/地区数大于1.因此,您只删除只有一个成员的组织。

              1. DISTINCT
              2. 如果“ABC”的随机国家/地区代码为1且随机国家/地区名称为“意大利”(它们不必属于一起,则两者都只是组织的独立随机选择)并且同一对恰好是组织'DEF'的选择,然后你删除其中一个,所以你得到1,'意大利'一次。

                1. 惊喜
                2. 我很惊讶你说这个查询有一个小缺陷。对不起,我觉得很难相信。