在mysql中,":="操作符是赋值操作符,用于将一个值赋给一个变量。

34

我有一个mysql表格(scho_id, school_name, school_views)。

我正在寻找一个mysql查询语句,以便根据school_views获取学校的排名rank

我在stackoverflow上找到了这个解决方案。

SET @points := -1, @num := 0;
SELECT scho_id
, school_views
, @num := if(@points = school_views, @num, @num + 1) as school_rank
, @points := school_info.school_views as dummy
FROM school_info
ORDER BY school_views desc, scho_id asc;

这解决了我的问题,但我注意到这个查询中有一个新的运算符:=。我很好奇了解这个运算符的含义和用途。


如果你只是查看mysql文档(https://dev.mysql.com/doc/refman/8.0/en/assignment-operators.html#operator_assign-value),你会发现......它们是错误的。很好。 - Joe Phillips
1个回答

52
在MySQL中,:=是一个赋值运算符:
SELECT @foo := 'bar';    // variable 'foo' now has value 'bar'
return value: 'bar'

=被用来进行相等性测试时:

SELECT @foo = 'hi mom'; // does variable 'foo' have the value 'hi mom';
return value: false   ('bar' == 'hi mom' -> false)
请注意,您可以使用set查询进行等值测试和赋值操作。
SET @foo = 'bar' = 'baz';

这将导致@foo被赋值为false,即'bar' = 'baz'的布尔结果。它的执行如下:

SET @foo = ('bar' = 'baz');
SET @foo = false;

所以如果在“SET”语句中使用“=”(相等测试运算符),它将作为赋值运算符工作? 例如 - SET @param ='some value' 和使用UPDATE语句,例如UPDATE table_name SET column_name ='value' - prograshid
2
是的。在“set”中的第一个=表示赋值。集合查询无法返回任何内容,因此使用=进行相等性测试没有太多意义。该测试的结果无法返回。但是,现在这将进行测试和分配:set @foo ='bar' ='baz';@foo将被分配布尔结果的'bar' ='baz'相等性测试,例如false。 - Marc B
似乎在SELECT语句中不能使用已声明的变量:=。 - Timofeus
讲解得非常好。谢谢。 - Daniel_Ranjbar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接