我有一个包含 c 1m 行的 mysql 表。假设它们可能看起来像这样:
name
flower 1
flower 2
flower 3
fish 1975
ocean
field
tree 1
tree 2
tree 3
我需要标记序列。
目前,我正在使用正则表达式 '([a-zA-Z] [0-9]+)$'
之类的东西,工作正常但选择了 'fish 1975'
这在理想情况下是我想避免的,因为它只出现一次,因此可能不是一个有序的条目,它只是在末尾有一个数字。
我无法弄清楚如何/如果我可以在 mysql 中的一个步骤中说“只要在数字之前有 N 个其他行具有相同的字符,就获取以数字结尾的行”。
使用此查询:
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 |