我希望从PHP中获得与从MySQL工作台调用相同的SQL查询时相同的结果。我在MySQL工作台中得到的结果与使用CASE语句时从PHP调用它时得到的结果不同。下面是SQL:
@row_number:=CASE
WHEN @row_number IS NULL THEN
1
WHEN @dateTime = scrm_lessons_id_lesson THEN
@row_number + 0
WHEN @dateTime != scrm_lessons_id_lesson THEN
@row_number + 1
END AS lesson_number,
@dateTime:= scrm_lessons_id_lesson AS 'LessonID'在Workbench中,这给了我想要的结果,即:
lesson_number LessonID
1 17282
2 17314
2 17314
2 17314
2 17314
2 17314
2 17314
2 17314
2 17314
3 17349
3 17349
3 17349
3 17349
3 17349
3 17349
3 17349
3 17349
4 17386
4 17386
4 17386
4 17386
4 17386
5 17416
5 17416也就是说,每一行有一个新的LessonID值,就会增加lesson_number的值。
但是,在PHP中,lesson_number的值总是1(所以每次@row_number为NULL时必须命中)。
这些语句是相同的,复制和粘贴,并运行在同一服务器上。一个是从远程连接到服务器的MySQL工作台调用的,另一个是从用PHP编写的服务器上的API调用的。
发布于 2020-10-27 14:57:02
在MySQL中,用户变量是很棘手的--它们现在正式计划在将来的版本中取消推荐。
如果您正在运行MySL 8.0 (或者您可以升级到该版本),只需使用窗口函数:dense_rank()完全满足您的要求。
select
dense_rank() over(order by scrm_lessons_id_lesson) lesson_number,
scrm_lessons_id_lesson lesson_id
from mytable发布于 2020-10-27 14:58:48
MySQL warns agains assigning variables and using them in the same expression
对于其他语句,例如SELECT,您可能会得到预期的结果,但这并不一定。在下面的语句中,您可能认为MySQL将首先计算@a,然后再执行赋值:
选择@a,@a:=@a+1,.
但是,涉及用户变量的表达式的计算顺序还没有定义。
您在不同的表达式中赋值和使用变量,因此不能保证计算表达式的顺序。甚至也不知道它们是按相同的顺序在同一个查询中计算的。
幸运的是,现在不推荐在SELECT语句中设置变量。在大多数情况下,您可以用窗口函数替换逻辑。
编辑:
您的代码似乎描述了该函数:
row_number() over (partition by scrm_lessons_id_lesson order by ?) as lesson_number?是因为我不知道顺序。它将基于现有查询中其他地方使用的order by子句。
https://stackoverflow.com/questions/64557027
复制相似问题