首页 > 解决方案 > “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

解决方案


如果您正在运行 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           |

推荐阅读