MySQL GROUP BY REGEXP

时间:2013-11-20 20:54:38

标签: mysql sql regex phpmyadmin

我正在尝试获取MySQL表translations字段中使用的缩写的完整列表。 这是我的表的条目可能是这样的

  -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工作的原因。

1 个答案:

答案 0 :(得分:0)

好的建议是第三种正常形式,但为了快速,我会尝试类似的东西:

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,然后查找一个点和点后的第一个空格(我们在开头(现在结束)连接一个空格以防万一' t one。现在你有一个分组值。

这只会找到最后一个缩写。在现场。

小提琴:http://sqlfiddle.com/#!2/b2e1b/11/0