mysql - “MYSQL:我如何输入编号?”
问题描述
我试图找到一个 MySQL 查询,它将对每个 DISTINCT 值进行编号。
id name
----- ------
1 Mark
2 Mike
3 Paul
4 Mike
5 Mike
6 John
7 Mark
预期结果。像这样的东西
count name
----- ------
1 Mark
2 Mark
1 Mike
2 Mike
3 Mike
1 John
1 Paul
解决方案
如果您正在运行 MySQL 8.0,您可以简单地使用row_number()
:
select
row_number() over(partition by name order by id) `count`,
name
from mytable
order by name, `count`
该查询依赖于列id
来对记录进行排序,因为它似乎是唯一的(如果没有其值在组中唯一的列,则具有相同名称的记录的排序是不可预测的)。
在早期版本中,row_number()
可以使用变量进行模拟:
select
case when @name = name then @cnt := @cnt + 1 else @cnt := 1 end `count`,
@name := name
from
(select name from mytable order by name, id) t
cross join (select @cnt := 1, @name := null) x
order by name, `count`
DB Fiddle 上的演示- 两个查询都返回:
| ----- | -------------- |
| 1 | John |
| 1 | Mark |
| 2 | Mark |
| 1 | Mike |
| 2 | Mike |
| 3 | Mike |
| 1 | Paul |
推荐阅读
- amazon-web-services - AWS Elasticsearch Service:如何删除集群 create_index 块?
- python - 无法使用 HTTPDigestAuth 创建会话?
- python - 如何使python自动以时间格式放置冒号(HH:MM:SS)
- javascript - 为什么我的控制台没有记录搜索输入?
- javascript - 建模 Firestore 数据库
- c# - 如何允许用户打开文件并将文件的每个新文件添加到列表框中?
- mongodb - kubernetes mongodb ops manager 为 pod“ops-manager-db-0”运行“VolumeBinding”过滤器插件:pod 具有未绑定的立即 PersistentVolumeClaims
- gcc - 禁用 g++ 构建的所有 AVX-512 指令
- asp.net-core - 如何转换 Ilogger
到 Ilogger 在 Asp.Net.Core - python - 如何从 Celery 队列中按名称删除任务