mysql - 按字段中的相同值对行进行分组,同时仅匹配部分值
问题描述
我有一张有很多行的表(在几千到几百万之间)。我需要我的查询来执行以下操作:
- 按字段中值的相同部分对结果进行分组;
- 首先按最大的组排序。
该表的大部分值只有部分相似(即后缀不同)。由于相似值的数量很大 - 我无法预测所有这些值。
这是我的桌子:
+--------+-----------+------+
| Id | Uri | Run |
+--------+-----------+------+
| 15145 | select_123| Y |
| 15146 | select_345| Y |
| 15148 | delete_123| N |
| 15150 | select_234| Y |
| 15314 | delete_334| N |
| 15315 | copy_all | N |
| 15316 | merge_all | Y |
| 15317 | select_565| Y |
| 15318 | copy_all | Y |
| 15319 | delete_345| Y |
+--------+-----------+------+
我想看到的是这样的(计数部分是可取的,但不是必需的):
+-----------+------+
| Uri | Count|
+-----------+------+
| select | 4 |
| delete | 3 |
| copy_all | 2 |
| merge_all| 1 |
+-----------+------+
解决方案
字符串的格式使得用字符串函数解析它很困难。
如果您运行的是 MySQL 8.0,您可以使用regexp_replace()
、thengroup by
和截断字符串order by
:
select regexp_replace(uri, '_\\d+$', '') new_uri, count(*) cnt
from mytable
group by new_uri
order by cnt desc
推荐阅读
- c# - Printing max value in a file
- ruby-on-rails - how do you clear jobs from ActiveJob queue?
- ruby - 什么会导致工作目录被改变(如果 `Dir.chdir` 没有被调用)?
- mysql - 在mysql中搜索特定单词
- javascript - websocket 服务器如何在一个对象中保存不同的客户端信息?
- php - 使用正则表达式将包含浮点数的字符串清理为数字和小数
- sql-server - 根据列值重复行N次,重复次数不限
- c - printf 序列点
- php - Codeigniter 更新的 SQL 问题
- php - Symfony4中Doctrine MongoDB ODM中单个字段的唯一约束