我正在尝试获取在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,我可以显示所有包含缩写的行,即

  -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中工作。

最佳答案

关于第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,然后查找一个点和该点后的第一个空格(如果没有,我们在开头(现在为结尾)处连接一个空格。现在您有了一个分组的价值。

这只会找到最后一个缩写。在该领域。

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

关于mysql - MySQL GROUP BY REGEXP,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20106803/

10-12 19:03