添加自定义行号

时间:2014-06-25 13:44:11

标签: 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服务器版本对应的手册,以便在'SELECT @num:= @ num + 1附近使用正确的语法作为row_num,t。* FROM table_1 t'在第1行“,我可以从phpMyAdmin查询这个没有任何问题,当我使用mysqli查询时,该语句有什么问题?

致以最诚挚的问候,

开尔文。

2 个答案:

答案 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