Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.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
Mysql 添加自定义行号_Mysql - Fatal编程技术网

Mysql 添加自定义行号

Mysql 添加自定义行号,mysql,Mysql,我想在SQL语句中添加一个自动行数,而不是使用自动递增列,因为有时某些记录可能会被删除,而自动递增列中的数字不是连续的 我的SQL语句是 $sql = 'set @num=0; SELECT @num:= @num+1 as row_num, t.* FROM table_1 t;'; 我使用mysqli查询语句,$result=$db->query($sql) 我得到错误“您的SQL语法有错误;请检查与您的MySQL服务器版本对应的手册,以了解在第1行的“从表_1t中选择@num:=@num

我想在SQL语句中添加一个自动行数,而不是使用自动递增列,因为有时某些记录可能会被删除,而自动递增列中的数字不是连续的

我的SQL语句是

$sql = 'set @num=0; SELECT @num:= @num+1 as row_num, t.* FROM table_1 t;';
我使用mysqli查询语句,$result=$db->query($sql)

我得到错误“您的SQL语法有错误;请检查与您的MySQL服务器版本对应的手册,以了解在第1行的“从表_1t中选择@num:=@num+1作为行_num,t.*”附近要使用的正确语法”,我可以从phpMyAdmin中毫无问题地查询该语句,当我使用mysqli进行查询时,该语句有什么问题

致以最良好的祝愿


开尔文。

Q:当我使用mysqli查询时,语句有什么问题

我怀疑问题在于您试图在一个语句执行中执行两个单独的SQL语句。(根据错误消息,看起来MySQL很好地读取了SET语句,但在第一个SET语句结束后,对后面的所有内容都犹豫不决。)

(请注意,某些客户端接口确实提供了一种方式,可以将连接配置为允许在单个语句执行的上下文中执行“多个语句”。但启用该配置会为某些严重的SQL注入漏洞打开大门。)


对于你没有问的问题,例如“我如何解决这个问题?”

作为一种解决方法,您可以使用内联视图初始化MySQL用户定义变量,例如:

SELECT @num := @num+1 as row_num
     , t.*
  FROM table_1 t
 CROSS
  JOIN (SELECT @num := 0 ) i
我们并不真正关心内联视图(别名为i)返回什么,只是因为JOIN操作,我们需要它只返回一行。我们真正感兴趣的是副作用:将值0赋值给用户定义的变量
@num


这种方法之所以有效,是因为MySQL将在外部查询运行之前处理内联视图查询并具体化结果集(作为派生表)。

为什么不使用
select*,@r:=@r+1作为表中的row\u num交叉连接(select@r:=0)作为t2
它将是单个查询,而不是在您的情况下使用
在SELECT之前使用AS init的目的是什么?“(SELECT@row\u num:=0)”是一个派生表,必须有自己的别名。别名并不重要,但其目的是初始化row_num值,因此名称为“init”。
SELECT @row_num:=@row_num+1 as row_num, t.*
FROM table_1 AS t, (SELECT @row_num:=0) AS init