我有一个在大表上运行的查询,因此我需要使其尽可能优化运行,并希望清理此特定方程式。

SET points = IF(
    (20 - ABS(pick.guessed_rank - team.rank)) < 0,
    0,
    (20 - ABS(pick.guessed_rank - team.rank))
)


我该如何改善以将ABS(pick.guess_rank - team.rank)保存到变量,以便更新看起来像这样:

@diff = ABS(pick.guess_rank - team.rank;
SET points = IF(@diff < 0, 0, @diff);


或许有比使用if语句更好的解决方案,但是在这种情况下如何使用变量的示例仍然会有所帮助。

最佳答案

您想要GREATEST函数在逻辑上做同样的事情:

SET @points = GREATEST(20 - ABS(pick.guessed_rank - team.rank), 0);


或更具体地

SET @diff = 20 - ABS(pick.guessed_rank - team.rank);
SET @points = GREATEST(@diff,0);


并获得额外的奖励积分

SET @min_margin=20;
SET @diff = ABS(pick.guessed_rank - team.rank);
SET @points_diff = GREATEST(@diff,@min_margin);


-编辑-

在直接SQL CLI中,我必须对每个变量使用@。我相信stored procedure有区别

关于mysql - MySQL如何在更新中使用局部变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46411091/

10-16 06:41