向mysql结果添加增量id

dy2hfwbg  于 2021-07-29  发布在  Java
关注(0)|答案(3)|浏览(269)

我的数据如下所示,

Data
A
A
B
B
C
X
D

我想用一个增量值来提取唯一/不同的结果。应该是这样的,

ID  VALUE
1   A
2   B
3   C
4   D
5   X

我试过下面的方法,

SET @row := 0;
SELECT @row := @row + 1 , mytable.mycolumn as VALUE
FROM change mytable, (SELECT @row := 0) r;

上面的结果是,

VALUE
1   A
2   A
3   B
4   B
5   C
6   D
7   X
umuewwlo

umuewwlo1#

如果您使用的是mysql 8+,那么 ROW_NUMBER 这里的方法是:

SELECT ROW_NUMBER() OVER (ORDER BY Data) AS ID, Data AS VALUE
FROM (SELECT DISTINCT Data FROM mytable) t
ORDER BY ID;

在mysql的早期版本中,您可以通过在首先选择不同的数据值之后使用用户变量生成行号来纠正当前的尝试:

SET @row := 0;
SELECT @row := @row + 1 , Data as VALUE
FROM (SELECT DISTINCT Data FROM mytable) t, (SELECT @row := 0) r;

如下面的演示所示,这是可行的。

演示

tv6aics1

tv6aics12#

我将从你的尝试开始。问题是您有重复的值。你必须先减少它们。要按字母顺序排列所有唯一值,必须执行以下操作:

SELECT DISTINCT mycolumn
FROM mytable
ORDER BY mycolumn;

现在在您的查询中,将mytable替换为上述查询,作为from中的嵌套select:

SELECT @row := @row + 1 AS ID, mytable_distinct.mycolumn as VALUE
FROM (  SELECT DISTINCT mycolumn
        FROM mytable
        ORDER BY mycolumn  ) AS mytable_distinct, (SELECT @row := 0) r;

一个更简单更干净的解决方案是在较新的mysql/mariadb版本中使用row\ u number函数。你可以这样做:

SELECT ROW_NUMBER() OVER (ORDER BY mycolumn) AS ID, mycolumn AS VALUE
FROM (  SELECT DISTINCT mycolumn
        FROM mytable ) AS mytable_distinct;

请注意,我们将order by移到了嵌套查询的外部,因为row\ u number()函数仍然需要order by运算符(无需执行两次)。
有一种更简单的方法可以在没有嵌套查询的情况下删除重复项,那就是使用groupby操作符。上面的查询可以这样重写:

SELECT ROW_NUMBER() OVER (ORDER BY mycolumn) AS ID, mycolumn AS VALUE
FROM mytable
GROUP BY mycolumn;

尽管有更干净的代码,但我不会使用groupby,因为虽然它在技术上会产生相同的结果,而且dbms可能足够聪明,可以用selectdistinct的相同方式解析它,但它的用途不同(用于聚合数据)。

eivnm1vs

eivnm1vs3#

例如,您的表名是mytable,然后使用下面的查询,否则仅用表名替换mytable

SELECT @rownum := @rownum + 1 AS row_number,
       table1.data
FROM   (SELECT DISTINCT data
        FROM   mytable) table1
       JOIN (SELECT @rownum := 0) r

相关问题