MySQL:如何获取带行的序列号?

JD *_*cks 3 php mysql sql

如何在最低ID为#1且最高ID为#numberOfResults的情况下对结果进行编号

示例:如果我的表中只有3行.它的ID是24,87,112,它会像这样拉:

ID  24  87  112
Num 1   2   3
Run Code Online (Sandbox Code Playgroud)

我想要这个的原因是,我的经理希望项目的编号类似于item1,item2等.我最初制作它所以它使用了ID,但他看到了像item24,item87,item112.他完全不喜欢它,并希望它们像item1,item2,item3.我个人认为这会导致问题,因为如果你要删除和添加项目,那么item2将不会总是引用相同的东西,并可能导致用户混淆.所以,如果有人有更好的主意,我想听听.

谢谢.

Mik*_*ike 11

我同意关于使用这样的编号方案的评论,如果这些数字将被用于除了带有数字的项目的简单有序显示之外的任何其他内容.如果数字实际上与某些东西联系在一起,那么这是一个非常糟糕的主意!

使用变量,并在SELECT语句中递增它:

SELECT
    id,
    (@row:=@row+1) AS row
FROM table,
(SELECT @row:=0) AS row_count;
Run Code Online (Sandbox Code Playgroud)

例:

CREATE TABLE `table1` (
    `id` int(11) NOT NULL auto_increment,
    PRIMARY KEY  (`id`)
) ENGINE=InnoDB

INSERT INTO table1 VALUES (24), (87), (112);

SELECT
    id,
    (@row:=@row+1) AS row
FROM table1,
(SELECT @row:=0) AS row_count;

+-----+------+
| id  | row  |
+-----+------+
|  24 |    1 |
|  87 |    2 |
| 112 |    3 |
+-----+------+
Run Code Online (Sandbox Code Playgroud)

这个怎么运作

@row是用户定义的变量.在主SELECT语句运行之前必须将其设置为零.这可以这样做:

SELECT @row:=0;
Run Code Online (Sandbox Code Playgroud)

或者像这样:

SET @row:=0
Run Code Online (Sandbox Code Playgroud)

但将两个陈述联系起来很方便.这可以通过创建派生表来完成,这是这里发生的事情:

FROM table,
(SELECT @row:=0) AS row_count;
Run Code Online (Sandbox Code Playgroud)

第二个SELECT实际上先运行.一旦完成,只需增加@row检索到的每一行的值:

@row:=@row+1
Run Code Online (Sandbox Code Playgroud)

@row每次检索行时,该值都会递增.无论访问行的顺序如何,它始终会生成一个连续的数字列表.所以它对某些东西很方便,对其他东西很危险......