首页 > 解决方案 > 按字段中的相同值对行进行分组,同时仅匹配部分值

问题描述

我有一张有很多行的表(在几千到几百万之间)。我需要我的查询来执行以下操作:

该表的大部分值只有部分相似(即后缀不同)。由于相似值的数量很大 - 我无法预测所有这些值。

这是我的桌子:

+--------+-----------+------+
|   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   |
+-----------+------+

标签: mysqlsqlstringgroup-bycount

解决方案


字符串的格式使得用字符串函数解析它很困难。

如果您运行的是 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

推荐阅读