Mysql 通过在MariaDB中显示不良结果进行订购

Mysql 通过在MariaDB中显示不良结果进行订购,mysql,sql,mariadb,sql-order-by,Mysql,Sql,Mariadb,Sql Order By,在我的查询中,我需要获取前一行和当前行,然后连接几个表。在我的开发服务器MySQL 5.7中,我使用SQL变量获得了前一行,一切正常,但在我的productionMariaDB 10服务器中,前一行的结果不好,只是混合了,不好的部分是前一行带有SQL变量,其他查询部分工作正常。在这之前,我认为问题在于sql变量部分,但现在我意识到问题是按关键字排序的 我的问题是: SELECT customers.title, calendar.start_time, calendar.ho

在我的查询中,我需要获取前一行和当前行,然后连接几个表。在我的开发服务器MySQL 5.7中,我使用SQL变量获得了前一行,一切正常,但在我的productionMariaDB 10服务器中,前一行的结果不好,只是混合了,不好的部分是前一行带有SQL变量,其他查询部分工作正常。在这之前,我认为问题在于sql变量部分,但现在我意识到问题是按关键字排序的

我的问题是:

SELECT
   customers.title,
   calendar.start_time, 
   calendar.hours_per_time,
   calendar.self_certification,
   calendar.bulletin_certification,
   calendar.extra,
   DATE_FORMAT(calendar.date, '%d-%m') AS day_month,
   TIME_FORMAT(calendar.start_time, '%H:%i') AS hours_min,
   @previous_start AS previous_start,
   @previous_start := calendar.start_time,
   @previous_end AS previous_end,
   @previous_end := calendar.hours_per_time

        FROM
          (SELECT @previous_start := '00:00', @previous_end := '0.00') AS calendar_prev, calendar

            INNER JOIN relationships ON calendar.relation_id = relationships.relation_id
            INNER JOIN customers ON customers.customer_id = relationships.customer_id

            WHERE relationships.user_id = '$user_id'
            AND DATE_FORMAT(calendar.date, '%m-%Y') = '$date'

        ORDER BY calendar.date, hours_min ASC
如果我将hours_min从订单中一部分一部分地删除,那么在两台服务器上都可以正常工作,但随后我就失去了订单

这是我从development server获得的结果,绿色部分来自sql变量,在这里工作正常:

这是来自生产服务器的红色部分中的不良结果


那么,我如何才能保持我的秩序,仍然有良好的结果?仅dateDato和hours_minFra kl需要订购。列。

将查询包装为内联视图,并在外部查询上指定不同的ORDER BY

作为该模式的简单演示:

SELECT v.fee
     , v.fo
     , v.fi
  FROM ( 
         SELECT t.fee
              , t.fi 
              , t.fo
           JOIN t
          ORDER BY t.fi ASC, t.fo ASC
       ) v
 ORDER
    BY v.fee DESC
我们可以使用内部SELECT语句上的ORDERBY子句,在内联视图中按顺序处理查询中的行

外部查询上的ORDER BY可以对内部查询返回的结果重新排序

注:

MySQL参考手册警告说,不能保证在同一语句中设置和读取的用户定义变量的行为。尽管如此,我们确实观察到了一致的行为

这是一个操作顺序问题。也就是说,我们正在谨慎地构建SQL,以便MySQL执行计划为我们提供可预测的操作顺序

我们发现,ORDER BY是在计算SELECT列表中的表达式之前处理的

因此,如果我们需要按顺序处理行,以便在计算SELECT列表中的表达式时,用户定义的变量包含来自前一行的值,那么我们需要有一个order BY,以获得所需顺序的行

如果我们希望结果行的顺序不同,我们需要稍后处理另一个ORDERBY操作。我们可以使用一个内联视图得到它,MySQL称之为派生表。这是因为MySQL在处理外部查询之前具体化了派生表v

外部查询的选择列表可以指定不同的列顺序或省略列。内部查询的SELECT列表中表达式的顺序可以由处理用户定义变量时所需的操作顺序决定:将当前行保存到用户定义变量的赋值必须在计算用户定义变量之后进行

此外,我建议放弃join操作的逗号语法,并用join关键字替换它。CROSS关键字是可选的,但它确实向未来的读者表明,省略ON子句是故意的,而不是疏忽

内部关键字也是可选的;它没有效果,我倾向于忽略这一点

 FROM (SELECT @previous_start := '00:00', @previous_end := '0.00') calendar_prev
CROSS
 JOIN calendar
 JOIN relationships 
   ON calendar.relation_id = relationships.relation_id

如果我理解正确,我只需要将orderby添加到我的子查询部分?如下所示:从选择@previous\u start:=“00:00”,“@previous\u end:=“0.00”按小时\u min排序,但我在“ORDER子句”中得到错误未知列“hours\u min”,并且连接t来自何处?我需要在这里加入哪个表。我有点困惑,请帮帮我。不,在进行初始化的内联视图上不需要ORDER BY。。它返回一行,我们并不真正关心它返回的行,我们只关心它只返回一行,因为它正在与查询中的其他视图/表联接。我们真正关心的是用户定义变量的初始化。这实际上可以作为一个单独的SET语句来完成,并从SELECT查询中省略;但我更喜欢在查询中执行此操作的模式。我的建议是,将在parens内部工作的查询包装起来,然后在外部查询中引用该查询,并在外部查询中添加ORDER BY。。。从v ORDER BY v中选择v.*。内联视图查询原始查询的paren中也可以有一个ORDER BY子句,这可能与外部查询的ORDER BY不同。MySQL参考手册再次警告,设置和读取用户定义变量的语句的行为/结果是不保证的。为了实现这一点,我们所追求的行为是首先通过索引访问或使用文件排序操作对行进行排序,然后使用用户定义的变量处理行。我们可以通过使MySQL具体化一个内联视图(也称为派生表)来实现这种行为。这是一个奇怪的演示,因为在这个实例中,内部视图是多余的!?!