GROUP BY在MySQL中有一列,但只有来自另一列的唯一组

时间:2013-06-19 13:27:58

标签: mysql

我有一张桌子。

id   title     value
1    title_a    value_z
1    title_a    value_y
1    title_a    value_x

2    title_a    value_z
2    title_a    value_y
2    title_a    value_x

3    title_a    value_z
3    title_a    value_y
3    title_a    value_w

4    title_a    value_z
4    title_a    value_y

5    title_a    value_z
5    title_a    value_y
5    title_a    value_x
5    title_a    value_w

我想回来:

1    title_a
3    title_a
4    title_a
5    title_a

换句话说,我想要GROUP BY id,但是要删除任何具有完全相同的'values'组的组。 (id 1和2具有相同的值x,y和z ..因此将它们分组为1个结果)。标题目前无关紧要。

我可以简单地想象答案,但不能为我的生活弄清楚如何编写查询。我已经尝试了所有可以想象的GROUP BY,DISTINCT和子查询,但是只要我按id分组,就无法检查'value'集的唯一性。

请帮助我,Stack Overflow,你是我唯一的希望......

1 个答案:

答案 0 :(得分:1)

您可以使用GROUP_CONCAT展开每个ID的value

SELECT
  id,
  title,
  GROUP_CONCAT(DISTINCT value ORDER BY value) AS AllValues
FROM myTable
GROUP BY id, title

结果将是:

  id     title     AllValues                        
 ------ --------- --------------------------------- 
     1   title_a   value_x,value_y,value_z          
     2   title_a   value_x,value_y,value_z          
     3   title_a   value_w,value_y,value_z          
     4   title_a   value_y,value_z                  
     5   title_a   value_w,value_x,value_y,value_z  

将其放入子查询中并获取ID的MINMIN的{​​{1}},按title分组,您将获得所需的结果:

AllValues

请注意,标题的SELECT MIN(id) AS MinID, MIN(title) AS MinTitle FROM ( SELECT id, title, GROUP_CONCAT(DISTINCT value ORDER BY value) AS AllValues FROM myTable GROUP BY id, title ) FlattenTitles GROUP BY AllValues ORDER BY MinID 是猜测;如果值不同,您可能有其他逻辑确定选择MIN

我已经测试了这个查询,我试图将它添加为SQL Fiddle,但SQLFiddle网站给了我一个奇怪的错误,我不在家里。