首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL CASE语句在工作台和角度中返回不同的结果

MySQL CASE语句在工作台和角度中返回不同的结果
EN

Stack Overflow用户
提问于 2020-10-27 14:53:22
回答 2查看 61关注 0票数 0

我希望从PHP中获得与从MySQL工作台调用相同的SQL查询时相同的结果。我在MySQL工作台中得到的结果与使用CASE语句时从PHP调用它时得到的结果不同。下面是SQL:

代码语言:javascript
复制
@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中,这给了我想要的结果,即:

代码语言:javascript
复制
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调用的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-10-27 14:57:02

在MySQL中,用户变量是很棘手的--它们现在正式计划在将来的版本中取消推荐。

如果您正在运行MySL 8.0 (或者您可以升级到该版本),只需使用窗口函数:dense_rank()完全满足您的要求。

代码语言:javascript
复制
select 
    dense_rank() over(order by scrm_lessons_id_lesson) lesson_number, 
    scrm_lessons_id_lesson  lesson_id
from mytable
票数 1
EN

Stack Overflow用户

发布于 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语句中设置变量。在大多数情况下,您可以用窗口函数替换逻辑。

编辑:

您的代码似乎描述了该函数:

代码语言:javascript
复制
row_number() over (partition by scrm_lessons_id_lesson order by ?) as lesson_number

?是因为我不知道顺序。它将基于现有查询中其他地方使用的order by子句。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64557027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档