相关疑难解决方法(0)

使用用户变量对行进行编号时保证

使用用户变量对行进行编号

我经常在这里找到答案,建议使用用户变量对某些事物进行编号.也许最明显的例子是从给定结果集中选择每隔一行的查询.(这个问题和查询类似于这个答案,但是这个答案实际上引发了这个问题).

SELECT *
FROM (SELECT *, (@row := @row + 1) AS rownum
      FROM (SELECT @row := 0) AS init, tablename
      ORDER BY tablename.ordercol
     ) sub
WHERE rownum % 2 = 1
Run Code Online (Sandbox Code Playgroud)

这种方法似乎通常有效.

小心的原因

另一方面,MySQ文档指出:

作为一般规则,您不应该为用户变量赋值并在同一语句中读取值.您可能会得到您期望的结果,但这不能保证.涉及用户变量的表达式的评估顺序是未定义的,可能会根据给定语句中包含的元素进行更改; 此外,MySQL服务器版本之间的订单不保证相同.

核心问题

所以我的问题不是如何使用当前服务器实现这样的排序,而是使用用户变量的建议解决方案是否保证在所有(合理)环境下以及所有未来版本的MySQL中都能正常工作.

通过"保证"我的意思是像MySQL文档或者一些标准的MySQL声称一致性与权威来源.缺乏这样的权威答案,可能会引用其他来源,如经常使用的教程或MySQL源代码的部分内容.通过"作品"我的意思是分配会按顺序执行,每个结果行一次,并在由产生的顺序的事实ORDER BY一致.

破解查询的示例

举个例子说明事情是否容易失败:

SELECT *
FROM (SELECT *, (@row := @row + 1) AS rownum
      FROM (SELECT @row := 0) AS init, tablename
      HAVING rownum …
Run Code Online (Sandbox Code Playgroud)

mysql sql variables user-variables

6
推荐指数
1
解决办法
582
查看次数

标签 统计

mysql ×1

sql ×1

user-variables ×1

variables ×1