我有一个带有1m行的mysql表。假设它们可能看起来像这样:
name
flower 1
flower 2
flower 3
fish 1975
ocean
field
tree 1
tree 2
tree 3
我需要标记序列。
当前,我正在使用类似regexp '([a-zA-Z] [0-9]+)$'
的方法,可以正常工作,但是选择了'fish 1975'
,理想情况下我想避免,因为它只出现一次,因此可能不是序列条目,它只是末尾有一个数字。
在MySQL的第一步中,我不知道如何/如果我能说出“让我得到以数字结尾的行,只要有N个其他行在数字前加相同的字符”。
答案 0 :(得分:2)
使用此查询:
select
left(name, char_length(name) - locate(' ', reverse(name))) prefix,
count(*) counter
from tablename
where name regexp '([a-zA-Z] [0-9]+)$'
group by prefix
在name
列中,您会获得所有名称的末尾都没有数字以及它们出现的次数。
将其加入表中,并在WHERE子句中应用所需的条件:
select t.*
from tablename t inner join (
select
left(name, char_length(name) - locate(' ', reverse(name))) prefix,
count(*) counter
from tablename
where name regexp '([a-zA-Z] [0-9]+)$'
group by prefix
)g on t.name like concat('%', g.prefix, ' %')
where g.counter > 2
请参见demo。
结果:
| name |
| -------- |
| flower 1 |
| flower 2 |
| flower 3 |
| tree 1 |
| tree 2 |
| tree 3 |