2013-11-26 4 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», они принадлежат к разным группам, а также «Emprendsores» и «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      | 

Я думаю, что ключ на последний номер предшествующей строка должна быть точно таким же, но я не знаю, как это сделать. Не могли бы вы мне помочь, пожалуйста?

Edit:

Есть также запись, как «Emprendedores» без какого-либо числа в конце, и это также должно быть сгруппировано с «Emprendedores 1» и «2» Emprendedores. Поэтому я думаю, что число больше не является ключевым, на самом деле я сомневаюсь, что существует способ группировать эти записи.

+0

Они не то же самое длина - но требуемая длина всегда одна буква меньше фактической длины, правильно? – Strawberry

+0

Да, вы правы. Я искал что-то вроде этого: Emprendsores 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

Я не понял, что есть записи типа «Emprendsores» без номера, принадлежащего к той же группе, что и «Emprendedores 1» и «Emprendedores 2», поэтому этот запрос не работает. Я редактирую свой вопрос. Извините, мой bad = ( –

+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

Я обнаружил, что они не всегда конец в номере, я только что редактировал мой quesiton.Извините = ( –

+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

Смежные вопросы