2017-08-09 95 views
2

我试图获取仅由唯一个人使用的颜色。使用下面的示例数据:筛选重复项后选择具有唯一值的行

+---------+-------------+ 
| color | name  | 
+---------+-------------+ 
| red  | Jane  | 
| red  | Jane  | 
| red  | Bob   | 
| blue | David  | 
| blue | Bill  | 
| green | Jack  | 
| green | Jack  | 
| purple | Jack  | 
| orange | Dan   | 
+---------+-------------+ 

我得到

选择颜色,名称 去掉重复的FROM表 GROUP BY颜色,名称;

+---------+-------------+ 
| color | name  | 
+---------+-------------+ 
| red  | Jane  | 
| red  | Bob   | 
| blue | David  | 
| blue | Bill  | 
| green | Jack  | 
| purple | Jack  | 
| orange | Dan   | 
+---------+-------------+ 

什么我需要做进一步筛选下来到我期望的结果集绿色,紫色,橙色的,只是因为只有一个人与该颜色相关联?

+0

我无法理解您的状况。 “你不想与其他颜色分享不同名称的颜色”是什么意思?为什么包含“orange”? –

+0

你的意思是具有完全不同名称的颜色吗? –

+0

@DavyM:是的,对于混乱感到抱歉。我试图想出一个非常具体的方式来描述它。我自从对这个问题进行了编辑。 –

回答

2

您可以通过在查询中进一步做到这一点。把你有的作为一个子查询,然后用它作为第二个子查询的来源,来计算每种颜色显示的不同名称的数量。然后,它将成为唯一名称数量为1的结果集中的一个选择。

SELECT color 
FROM (SELECT color, COUNT(name) namecount FROM (SELECT color, name 
      FROM table GROUP BY color, name) t1 
     GROUP BY color) t2 
WHERE namecount = 1 
+0

它的工作原理是,在向子查询添加别名后,它返回了正确的颜色,但我在哪里添加了与该颜色对应的名称列? –

+0

对颜色使用原始查询的INNER JOIN'选择颜色,名称FROM表GROUP BY颜色,名称'。这将仅为最终列表中的颜色生成单个名称记录。 – SandPiper