3

我只有一张桌子。

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,但消除任何具有完全相同“值”集的组。(id 1 和 2 具有相同的值 x、y 和 z.. 所以将它们分组为 1 个结果)。标题暂时不重要。

我可以如此简单地想象答案,但我一生都无法弄清楚如何编写查询。我已经尝试了所有可以想象的 GROUP BY、DISTINCT 和子查询,但似乎一旦我按 id 分组,就无法检查“值”集的唯一性。

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

4

1 回答 1

2

您可以使用GROUP_CONCAT扁平化value每个 ID。

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  

把它放到子查询中,取MINID 的 和 的MINtitle分组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标题的 是猜测;title如果值不同,您可能有其他逻辑来确定选择哪个。

我已经测试了这个查询,并尝试将其添加为 SQL Fiddle,但 SQLFiddle 站点给了我一个奇怪的错误,我在家里没有遇到。

于 2013-06-19T13:48:43.643 回答