2015-02-05 48 views
0

所以我有这个问题,我必须显示名称或国家不构成组织'世卫组织'在表ismember的一部分。这是我想出的SQL显示的国家不构成查询的一部分 - mysql

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 ; 

它的工作原理,它确实返回了不属于'WHO'的国家。我的问题是这种方法排除了不属于任何组织的国家。 I.E它排除那些在ismember表中没有条目的国家。

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

+0

你试过了一个OUTER连接吗? – PaulProgrammer 2015-02-05 21:03:02

回答

1

为什么不只是这样?

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

应该做同样的事情。 :)解决这个

+0

对,这样做不会滥用“GROUP BY”。 – 2015-02-05 21:04:29

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; 
0

这是没有答案,但解释你的查询做什么:

  1. 子查询

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

对于组织为“WHO”的表中的每个记录,然后将所有'WHO'减少为'WHO',这将得到字符串'WHO'。

  • NOT IN
  • 因此WHERE ismember.organization NOT IN (subquery)相同WHERE ismember.organization <> 'WHO'

  • LEFT JOIN
  • 您外左加入表国家。这意味着如果ismember包含一个不在国家/地区表中的国家,您仍然可以获得该记录。但为什么一个国家不在国家桌面?这似乎没有道理。你可能会得到像123, NULL这样的记录,这意味着国家代码123不是有效的国家,但是什么?

  • GROUP BY
  • 您组由组织。所以你得到每个组织一个结果行。你不是说你想要列出国家吗?

  • 聚合
  • 然后选择ismember.country和每个组织country.name。由于您没有指定像MAX(ismember.country)或MIN(country.name)这样的所需聚合,您会得到一个随机匹配。因此,如果在国家1,2和3有一个组织“ABC”,那么你会随机选择其中的一个。

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

  • DISTINCT
  • 如果“ABC”随机国家代码为1和随机国名是“意大利”(它们不具有属于一起两者都是组织的独立随机选择),同一对恰好是组织'DEF'的选择,然后你将其中一个删除,因此你得到1,'意大利'只有一次。

  • 惊喜
  • 我很惊讶你说这查询的工作与未成年人的缺陷。对不起,我觉得这很难相信。