选择多个相似的行

时间:2019-08-18 16:20:00

标签: mysql

我有一个带有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个其他行在数字前加相同的字符”。

1 个答案:

答案 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   |