2013-11-26 27 views
2

假设我有一个表像这样集团通过相似的弦

| 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”不一样,它们属于不同的群体,“Emprendedores”和“Emprendedoras”也不同。

这是查询我:

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      | 

我认为关键是最后一个数字前面的字符串必须完全一样,但我不知道该怎么做。请问你能帮帮我吗?

编辑:

也有像“Emprendedores”记录,没有任何数字在年底,这也应与“Emprendedores 1”和“2 Emprendedores”进行分组。所以我认为这个数字不再是关键,实际上我怀疑是否存在将这些记录分组的方法。

+0

他们是不一样的长度 - 但所需的长度总是比实际长度少一个字母,对? – Strawberry

+0

是的,你说得对。我正在寻找这样的东西:Emprendedores 10但它不存在。所以实际上所有的记录都有一个字符超过了所需的长度 –

回答

3

如何如下:

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,显示它的作品。

+0

我还没有意识到有像'Emprendedores'这样的记录没有与'Emprendedores 1'和'Emprendedores 2'属于同一组的数字,所以这个查询不会'工作。我在编辑我的问题。对不起,我的坏=( –

+0

* @ Jorge Zapata *,我更新了我的答案,以检查最后没有数字的'nombre'。 – Linger

+0

它完美地工作,谢谢你! –

1

如果项目削减仅仅是数字,他们总是用空格分隔:

SELECT CASE nombre REGEXP '[0-9]$' 
     WHEN 1 THEN REVERSE (SUBSTR(REVERSE(nombre), 
           INSTR(REVERSE(nombre),' '))) ELSE nombre END grupo, 
     GROUP_CONCAT(id_grupo)  
    FROM grupos 
    GROUP BY grupo; 

只是建议... :)可能不是最高效的。优势在于,它最终也可以处理更多的数字。

结账this Fiddle

+0

我发现他们并不总是数量结束,我刚刚编辑了我的问题。对不起=( –

+0

您可以使用'CASE' - 请参阅上面的编辑:) – Trinimon

0

如果没有像“洛杉矶2个吾友1”的任何条目,然后

SELECT *, GROUP_CONCAT(id_grupo) 
FROM creabien_sacredi_dev.grupos 
GROUP BY --replace digits with spaces 
REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
nombre, 
'0',' '),'1',' '),'2',' '),'3',' '),'4',' '),'5',' '),'6',' '),'7',' '),'8',' '),'9',' ') 
+0

不错,但是,我认为您需要在整个东西周围使用'TRIM';) – Trinimon