Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL:如何获取具有行的序列号?_Php_Sql_Mysql - Fatal编程技术网

Php MySQL:如何获取具有行的序列号?

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为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项那样。我个人认为这会导致问题,因为如果您删除和添加项目,那么项目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美元。我会将您标记为已接受的答案,因为您给出了我的问题所要求的内容,但我会尝试在实施之前让我的经理同意其他内容。谢谢四年后,这让我省了一个下午的头疼。非常感谢。