【发布时间】:2013-04-25 12:13:01
【问题描述】:
我想使用用户定义的变量更新一组具有序号的 MySQL 记录的“排名”。以下查询通过 MySQL 命令行运行良好:
SET @rank:=0; UPDATE scores SET rank=@rank:=@rank+1 WHERE game_id=4 ORDER BY score DESC
但如果我尝试使用 Laravel 将其作为 Fluent 查询运行,则会失败。
DB::query("SET @rank:=0; UPDATE scores SET rank=@rank:=@rank+1 WHERE game_id=4 ORDER BY score DESC");
错误信息:
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL
syntax; check the manual that corresponds to your MySQL server version for the right
syntax to use near 'UPDATE scores SET rank=@rank:=@rank+1 WHERE game_id=4 ORDER BY' at line 1
SQL: SET @rank:=0; UPDATE scores SET rank=@rank:=@rank+1 WHERE game_id=4 ORDER BY score DESC
Bindings: array (
)
[已解决]
DB::raw() 来救援!以下作品:
DB::query(DB::raw("SET @rank:=0"));
DB::query("UPDATE scores SET rank=@rank:=@rank+1 WHERE game_id=4 ORDER BY score DESC");
【问题讨论】:
-
+1。很有意思。我也有兴趣找到这个问题的答案。
-
重点是这不是一种说法,而是两种说法。从一个查询中设置用户变量,然后使用相同的数据库连接,运行您的更新。
-
我试过了。尝试仅运行“SET @rank:=0”查询会导致以下错误:“方法 [] 未在 Query 类上定义。”
-
@JamieTibbetts 你能提供那个错误的堆栈跟踪吗?
-
DB::query("SET @rank:=0") 的堆栈跟踪太长,无法放入评论,但这是它的屏幕截图:link