mysql 赋值问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
su2018
V2EX    MySQL

mysql 赋值问题

  •  
  •   su2018 2022-09-27 15:36:34 +08:00 2207 次点击
    这是一个创建于 1110 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如图所示 图

    上面的 sql 没有赋值成功

    下面的却可以

    4 条回复    2022-09-29 17:15:33 +08:00
    lookStupiToForce
        1
    lookStupiToForce  
       2022-09-27 17:32:24 +08:00
    以下仅针对 5.7 之前的版本,之后的版本不确定

    mysql 自定义变量的执行顺序是这样的,飘忽不定(可能按行可能按列,甚至还可能行列交叉赋值),不知道有谁能有确切的文档描述它的执行顺序 /执行规则
    所以在不确定赋值顺序的情况下,在多个列里重复使用自定义变量是个危险的“未定义”行为
    wxf666
        2
    wxf666  
       2022-09-27 17:33:39 +08:00   1
    1. 确实,本地可构建个类似的语句来复现,不知缘由:

    *( V 站排版原因,开头有全角空格。若要复制运行,记得删除)*

    ```mysql
    WITH
      nums(num) AS (
       VALUES ROW(1), ROW(2), ROW(3)
     )

    SELECT @total, @total := sum(num)
    FROM nums, (SELECT @total := 0) t
    GROUP BY num;
    ```



    2. 如果你只是想要『上一行的数据』,你可以使用*(连 SQLite 都支持的)*窗口函数 `LAG`:

    ```sql
    WITH
      nums(num) AS (
       VALUES ROW(1), ROW(2), ROW(3) -- SQLite 写法:VALUES (1), (2), (3)
     )

    SELECT num, LAG(num) OVER(ORDER BY num)
    FROM nums;
    ```



    3. 另外,[MySQL 官方文档]( https://dev.mysql.com/doc/refman/8.0/en/user-variables.html ) 很不推荐你图片中的用法:

    - 除了 `SET` 语句外,不应在同一条语句内赋值和读取一个用户变量*( 5.7 版本文档:As a general rule, other than in SET statements, you should never assign a value to a user variable and read the value within the same statement )*

    - 涉及用户变量的表达式的求值顺序未定义*( 8.0 版本文档:The order of evaluation for expressions involving user variables is undefined. For example, there is no guarantee that SELECT @a, @a:=@a+1 evaluates @a first and then performs the assignment )*

    - 『在 `SELECT` 中使用 `:=` 为用户变量赋值』已被弃用,未来会移除*( 8.0 版本文档:Previous releases of MySQL made it possible to assign a value to a user variable in statements other than SET. This functionality is supported in MySQL 8.0 for backward compatibility but is subject to removal in a future release of MySQL )*
    su2018
        3
    su2018  
    P
       2022-09-29 17:14:08 +08:00
    @lookStupiToForce 确实, 好像不同版本之间不一样, 在我的笔记本的顺序是错的, 在公司的电脑确实正确的 太魔幻了
    su2018
        4
    su2018  
    OP
       2022-09-29 17:15:33 +08:00
    @wxf666 谢谢啦, 我的 mysql 版本是 5.6 的 还不支持窗口函数 感觉 8.0 的好很多
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     969 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 19:00 PVG 03:00 LAX 12:00 JFK 15:00
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86