在MySQL中将相似的行分组

时间:2014-02-18 20:54:57

标签: mysql sql group-by

我不知道如何解释这个问题,所以请耐心等待。

我正在尝试将相似的行组合在一起,基本上忽略第n + 1行,如果它们相同的话。我不确定这在MySQL中是否容易做到。这些行除了描述之外不共享任何其他属性。如果有其他重复的“描述”彼此不相邻,我仍然希望它们被返回。

我的表格中包含与此类似的条目:

+--+-------------------------+
|id|description              |
+--+-------------------------+
| 1|hello                    |
+--+-------------------------+
| 2|foobar                   |  \_   Condense these into one row
+--+-------------------------+  /
| 3|foobar                   |
+--+-------------------------+
| 4|hello                    |
+--+-------------------------+
| 5|world                    |  \__   Condense these into a row
+--+-------------------------+  /
| 6|world                    |
+--+-------------------------+
| 7|puppies                  |
+--+-------------------------+
| 8|kittens                  |  \__   These too...
+--+-------------------------+  /
| 9|kittens                  |
+--+-------------------------+
|10|sloths                   |
+--+-------------------------+
|11|kittens                  |
+--+-------------------------+

1 个答案:

答案 0 :(得分:2)

你可以通过巧妙的技巧来做到这一点。诀窍是从id的描述中计算与不同的特定ID相关的描述数。对于序列中的值,此数字将相同。

在MySQL中,您可以使用相关子查询进行此计数。其余的只是按此字段分组以将值组合在一起:

select min(id) as id, description, count(*) as numCondensed
from (select t.*,
             (select count(*)
              from table t2
              where t2.id <= t.id and t2.description <> t.description
             ) as grp
      from table t
     ) t
group by description, grp;