2013-11-20 5 views
0

Я пытаюсь получить полный список сокращений, которые используются в полях моей таблицы MySQL translations. Это как элементы моей таблицы может выглядетьMySQL GROUP BY REGEXP

-english-    -german- 

to hit sb.   | jmd. schlagen 
so. stole my bike | jd. hat mein Fahrrad gestohlen 
I am tall   | ich bin gross 
to see sb.   | jmd. sehen 
1, 2, 3, etc.  | 1, 2, 3, usw. 
tree    | Baum 
        ... 

Использование запроса MySQL SELECT, SELECT english FROM translations WHERE english REGEXP '[a-zA-Z]{2,}[.]' GROUP BY english я могу показать все строки, которые содержат abbriviation, т.е.

-english-    -german- 

to hit sb.   | jmd. schlagen 
so. stole my bike | jd. hat mein Fahrrad gestohlen 
to see sb.   | jmd. sehen 
1, 2, 3, etc.  | 1, 2, 3, usw. 
        ... 

Результаты сгруппированы, поэтому не отображаются две строки с идентичным содержимым поля english. Несколько случаев аббревиатуры перечислены отдельно, однако, например, sb. появляется дважды. Из-за большого количества строк в translations (около десяти миллионов) существует слишком много вложений общих аббревиатур, таких как sb. или sth., так что для создания списка различных сокращений становится невероятно трудоемким.

Мне интересно, есть ли способ группироваться по наличию шаблона REGEXP, как, например, SELECT english FROM translations WHERE english REGEXP '[a-zA-Z]{2,}[.]' GROUP BY english REGEXP '[a-zA-Z]{2,}[.]'

Мне нужно составить этот список только один раз, поэтому я работаю в phpMyAdmin.

+0

Прекрасный пример для третьей нормальной формы. –

+0

Исправьте ваш дизайн. Нормализовать до 3-го уровня, как предположил Майк Б., а затем ваша проблема по существу уходит. –

ответ

0

Хороший совет вновь 3-й нормальной форме, но недоброкачественной, я хотел бы попробовать что-то вроде:

SELECT 
    reverse(substring(reverse(english) 
      , locate('.', reverse(english)) 
      , locate(' ', concat(reverse(english), ' '), locate('.', reverse(english))) - locate('.', reverse(english)) 
     )) AS abbr 
FROM translations 
WHERE english LIKE '%.%' 
GROUP BY abbr 

Это переворачивает строку так abbr..rbba становится, а затем ищет точки и первое пространство после того, точка (мы Concat пространства в начале (теперь конец) в случае, если не один. Теперь у вас есть значение группы по.

Это будет только найти последний сокр. в поле.

Fiddle: http://sqlfiddle.com/#!2/b2e1b/11/0