我正在尝试获取在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/