mysql - 按相似字符串分组

标签 mysql sql group-by case

假设我有一张这样的 table

| id_grupo |    nombre       |
|:---------|----------------:|
| 1        | Emprendedores 1 |     
| 2        | Emprendedores 2 |    
| 3        | Emprendedoras 1 |      
| 4        | Emprendedoras 2 |         
| 5        | Los amigos 1    |       
| 6        | Los amigos 2    |
| 7        | Los amigos no 1 |  

我想按相同但结尾数字不同的名称进行分组。如果仔细观察,会发现有些名称由两个或多个单词组成,但区别在于结尾。还有一些看起来相似但不一样的名字,比如“Los amigos”和“Los amigos no”,它们属于不同的群体,“Emprendores”和“Emprendoras”也是不同的。

这是我的查询:

SELECT *, GROUP_CONCAT(id_grupo) 
FROM creabien_sacredi_dev.grupos
GROUP BY SUBSTRING(nombre,1,5)

它适用于大多数记录,但问题出在与示例中非常相似的字符串上。我选择了一个包含 5 个字符的子字符串,但实际上名称的长度不同,因此某些字符串无法按预期工作。

如何按以下形式对这些字符串进行分组?

    | id_grupo |    nombre       | GROUP_CONCAT(id_grupo) |
    |:---------|----------------:|-----------------------:|
    | 1        | Emprendedores 1 |  1,2                   |    
    | 3        | Emprendedoras 1 |  3,4                   |   
    | 5        | Los amigos 1    |  5,6                   |
    | 7        | Los amigos no 1 |  7                     |

我认为关键在于最后一个数字与前面的字符串必须完全相同,但我不知道该怎么做。你能帮我一下吗?

编辑:

还有像“Emprendores”这样的记录末尾没有任何数字,这也应该与“Emprendores 1”和“Emprendores 2”分组。所以我认为数字不再是关键,事实上我怀疑是否存在一种方法来对这些记录进行分组。

最佳答案

以下怎么样:

SELECT CASE 
         WHEN RIGHT(nombre, 1) BETWEEN '0' AND '9' THEN 
         LEFT(nombre, Length(nombre) - 2) 
         ELSE nombre 
       END AS nombrechecked, 
       Group_concat(id_grupo) 
FROM   grupos 
GROUP  BY 1 

这是SQL Fiddle这表明它有效。

关于mysql - 按相似字符串分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20222990/

相关文章:

sql - 在 Oracle 中使用什么来编写和编辑存储过程?

MYSQL - 按 2 列分组,按创建日期排序

python - Django 1.8.2(使用Python 3.4): How is a CharField with choices stored in a MySQL table with an ENUM column?

sql - Sql server 2008R2查询日期时间的方法

mysql - SQL中表的第一个和第二个日期

sql - Oracle ALTER 语句中可以使用子查询吗?

mysql:将一张表中的字段分别分组

php - 按小时选择摘要中的行并将其分组

mysql - 为什么 MySQL 在运行查询时不使用我的索引?

mysql - 如何使用 MULTER、Nodejs 和 MySQL 发布表单数据(图像和数据)