我有一张桌子。
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,你是我唯一的希望......
答案 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的MIN
和MIN
的{{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网站给了我一个奇怪的错误,我不在家里。