2013-11-20 3 views
0

내 MySQL 테이블 translations의 필드에 사용 된 약어의 전체 목록을 얻으려고합니다. 이 내 테이블의 항목이,MySQL 그룹 별 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 
        ... 

내가 abbriviation를 포함하는 모든 행을 표시 할 수는 MySQL SELECT 쿼리 SELECT english FROM translations WHERE english REGEXP '[a-zA-Z]{2,}[.]' GROUP BY english 사용처럼 보일 수 있습니다 즉

-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 (약 1 천만)의 행 수가 많기 때문에 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

디자인을 수정하십시오. 마이크 B가 제안한대로 세 번째 법선으로 표준화하면 문제가 근본적으로 사라집니다. –

답변

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. 이제 당신은에 의해 그룹에 값을 가지고있다.

이 마지막 약식을 찾을 수 있습니다. 현장에서.

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