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