You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MariaDB 10中SQL变量获取前一行数据异常问题求助

解决MariaDB 10中用户变量获取前一行数据混乱的问题

这个坑我之前踩过!核心问题在于MySQL 5.7和MariaDB 10的查询优化器对用户变量赋值与SELECT列、ORDER BY的执行顺序逻辑不一样。你原SQL里把变量赋值和查询列混在一层,MariaDB的优化器可能先执行了变量赋值,再做排序,导致@previous_start和@previous_end拿到的根本不是排序后的前一行数据,结果自然乱了。

修正思路

必须保证先完成数据的排序,再基于排序后的结果处理变量赋值。所以我们要把排序逻辑放到子查询里,先把关联好的数据集按需求排好序,再在外层处理变量的初始化和前一行关联操作。

修正后的SQL语句

SELECT
    customers.title,
    cal.start_time,
    cal.hours_per_time,
    cal.self_certification,
    cal.bulletin_certification,
    cal.extra,
    @previous_start AS previous_start,
    @previous_start := cal.start_time,
    @previous_end AS previous_end,
    @previous_end := cal.hours_per_time,
    cal.day_month,
    cal.hours_min
FROM (
    -- 先完成关联、过滤和排序,输出有序的基础数据集
    SELECT
        c.title,
        cal_inner.start_time,
        cal_inner.hours_per_time,
        cal_inner.self_certification,
        cal_inner.bulletin_certification,
        cal_inner.extra,
        DATE_FORMAT(cal_inner.date, '%d-%m') AS day_month,
        TIME_FORMAT(cal_inner.start_time, '%H:%i') AS hours_min
    FROM calendar cal_inner
    INNER JOIN relationships rel ON cal_inner.relation_id = rel.relation_id
    INNER JOIN customers c ON c.customer_id = rel.customer_id
    WHERE rel.user_id = '$user_id' 
      AND DATE_FORMAT(cal_inner.date, '%m-%Y') = '$date'
    ORDER BY cal_inner.date, hours_min ASC
) AS cal,
(SELECT @previous_start := '00:00', @previous_end := '0.00') AS vars

关键细节说明

  • 子查询cal先做完所有表关联、条件过滤和排序,确保拿到的是完全符合你预期顺序的数据集。
  • 外层查询基于这个有序数据集处理变量赋值,此时@previous_start和@previous_end会严格按照行的顺序逐个更新,每次取的都是上一行的对应值。
  • 我给表和列加了简短别名,让逻辑更清晰,你可以根据实际业务习惯调整。

这样修改后,MariaDB 10里的结果就会和MySQL 5.7一致,前一行数据的关联就能正常工作了。

内容的提问来源于stack exchange,提问作者SkySonny

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:50:10