mysql - 选择多个相似行

标签 mysql

<分区>

我有一个包含 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   |

关于mysql - 选择多个相似行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57546355/

相关文章:

mysql - 报表生成器中 WHERE 子句中的 SQL 可选条件

MySQL:从一列中选择多个最大值

java - 我的第一个自动 SQL 插入 : I feel im losing a lot of performance here

mysql - 用最少的时间总和获得最多的用户分数

mysql - Sinatra 的 REST API 路由无法正常工作

mysql - 通过 Doctrine 选择查询后,错误 : Invalid PathExpression. 必须是 StateFieldPathExpression

mysql - 如何使用 NOT 语法获取记录?

mysql - 通过互联网同步数据库的最佳方式是什么? MySQL

mysql - 主日志位置在 MySQL 复制中不移动

javascript - 函数在循环之前未完成