我正在尝试获取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工作的原因。
答案 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。现在你有一个分组值。
这只会找到最后一个缩写。在现场。