Php MySQL:如何获取具有行的序列号?
如果最低ID为1,最高ID为numberOfResults,如何对结果进行编号 示例:如果我有一个只有3行的表。他的ID是24,87,112它会这样拉:Php MySQL:如何获取具有行的序列号?,php,sql,mysql,Php,Sql,Mysql,如果最低ID为1,最高ID为numberOfResults,如何对结果进行编号 示例:如果我有一个只有3行的表。他的ID是24,87,112它会这样拉: ID 24 87 112 Num 1 2 3 SELECT @row:=0; SET @row:=0 我之所以要这样做,是因为我的经理希望对项目进行编号,如项目1、项目2等。我最初使用ID进行编号,但他看到的是项目24、项目87、项目112。他一点也不喜欢这样,希望他们像第1项、第2项、第3项那样。我个人认为这会导致问题,因
ID 24 87 112
Num 1 2 3
SELECT @row:=0;
SET @row:=0
我之所以要这样做,是因为我的经理希望对项目进行编号,如项目1、项目2等。我最初使用ID进行编号,但他看到的是项目24、项目87、项目112。他一点也不喜欢这样,希望他们像第1项、第2项、第3项那样。我个人认为这会导致问题,因为如果您删除和添加项目,那么项目2将不总是引用相同的内容,并可能导致用户混淆。所以如果有人有更好的主意,我想听听
谢谢。该ID的用途是什么
如果只是为了快速方便地引用,那也没关系,但是如果要以您提到的任何方式用于删除或管理,那么您唯一的选择就是为表中的每一行分配一个唯一的新ID列。但是这样做是毫无意义的,因为这重复了初始ID列的用途。听起来,在代码中输入该数字比尝试使用SQL实现某种复杂的方式要好。当在元素中循环时,只需保持顺序性。我同意这样的评论:如果数字将用于除简单有序显示带有数字的项目之外的任何事情,则不使用这样的编号方案。如果这些数字真的与某件事有关,那么这真是个糟糕的主意 使用变量,并在SELECT语句中递增该变量:
SELECT
id,
(@row:=@row+1) AS row
FROM table,
(SELECT @row:=0) AS row_count;
例如:
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 |
+-----+------+
工作原理
@行是用户定义的变量。在主SELECT语句运行之前,必须将其设置为零。可以这样做:
ID 24 87 112
Num 1 2 3
SELECT @row:=0;
SET @row:=0
或者像这样:
ID 24 87 112
Num 1 2 3
SELECT @row:=0;
SET @row:=0
但将这两种说法联系在一起很方便。这可以通过创建一个派生表来实现,这里就是这样:
FROM table,
(SELECT @row:=0) AS row_count;
第二个SELECT实际上首先运行。完成后,只需为检索到的每一行增加@row的值:
@row:=@row+1
每次检索行时,@row值都会递增。它将始终生成一个连续的数字列表,无论访问行的顺序如何。因此,它对某些事情来说是方便的,而对其他事情来说则是危险的……我的公司在CMS系统上遇到了类似的挑战,该系统使用订单字段对网站首页上的文章进行排序。用户想要一个升级、降级图标,他们可以点击它来上下移动文章 同样,这并不理想,但我们使用的策略是构建一个升级函数和相应的降级函数,该函数通过查询标识当前排序值,分别从上一个或下一个值中添加或减去一个值,然后设置初始升级/降级项的值。设计记录插入以准确设置新添加记录的初始值也很重要,这样插入不会导致添加重复值。为了安全起见,这也在DB级别强制执行。用户从未被允许直接输入排序值,只能通过图标进行升级或降级。老实说,它对用户来说工作得很好
如果你必须走这条路……这不是不可能的。但这也会对大脑造成损害……试着说服你的老板这是个坏主意,原因正是你提到自己的原因:如果一个项目被删除了会发生什么。不仅如此,用户不应该被束缚在某种任意的编号方案中。我不会在前端显示任何一个ID。如果他们想要一件物品,他们应该知道它的名字。在某些情况下,项目可能非常相似,或者名称可能难以使用医疗系统,然后设置一个编号方案可能很有用,但通常最好对用户隐藏这些细节。谢谢,我以前从未见过类似@row:=的东西。如果你不介意的话,你能解释一下那里发生了什么吗?@John Isaacks:我更新了我的答案,解释了它是如何工作的。谢谢你的解释和回答+1美元。我会将您标记为已接受的答案,因为您给出了我的问题所要求的内容,但我会尝试在实施之前让我的经理同意其他内容。谢谢四年后,这让我省了一个下午的头疼。非常感谢。