我想在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服务器版本对应的手册,以便在'SELECT @num:= @ num + 1附近使用正确的语法作为row_num,t。* FROM table_1 t'在第1行“,我可以从phpMyAdmin查询这个没有任何问题,当我使用mysqli查询时,该语句有什么问题?
致以最诚挚的问候,
开尔文。
答案 0 :(得分:1)
问:使用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将处理内联视图查询并实现结果集(作为派生表),在外部查询运行之前。
答案 1 :(得分:0)
SELECT @row_num:=@row_num+1 as row_num, t.*
FROM table_1 AS t, (SELECT @row_num:=0) AS init