【问题标题】:MariaDB query problems (ORDER BY ignored)MariaDB 查询问题(ORDER BY 被忽略)
【发布时间】:2018-06-14 17:15:15
【问题描述】:

我有一个运行良好的 MySQL 查询,但我的托管提供商将我的数据库更改为 MariaDB。查询本身工作正常,但我无法像在 MySQL 中那样让排序正常工作。

是否有一些语法已更改或不再可用?

    SELECT
 id,
  name,
  position,
  player1,
  player1_thru,
  player1_to_par,
  player2,
  player2_thru,
  player2_to_par,
  player3,
  player3_thru,
  player3_to_par,
  team_total,
  IF (counter = 1, @rank:= placeholder, @rank) AS ranker
FROM(
  SELECT
    *,
    @c := @c +1 AS placeholder,
    IF(@a <> team_total, @b := @b := 1, @b :=0) AS counter,
    @a := team_total
  from(
    SELECT
        usopen_2018.id,
        usopen_2018.position
        , usopen_2018.name
       , usopen_2018.player1
       , player1_score.hole as player1_thru
       , player1_score.to_par_s AS player1_to_par
       , usopen_2018.player2
       , player2_score.hole as player2_thru
       , player2_score.to_par_s AS player2_to_par
       , usopen_2018.player3
       , player3_score.hole as player3_thru
       , player3_score.to_par_s AS player3_to_par
       , (player1_score.`to_par` + player2_score.`to_par` + player3_score.`to_par`) AS team_total
    FROM usopen_2018
    INNER JOIN leaderboard_A AS player1_score
      ON player1_score.name = usopen_2018.player1
      AND player1_score.tournament_name = 'U.S. Open'
      AND player1_score.year = 2018
    INNER JOIN leaderboard_A AS player2_score
      ON player2_score.name = usopen_2018.player2
      AND player2_score.tournament_name = 'U.S. Open'
      AND player2_score.year = 2018
    INNER JOIN leaderboard_A AS player3_score
      ON player3_score.name = usopen_2018.player3
      AND player3_score.tournament_name = 'U.S. Open'
      AND player3_score.year = 2018
    WHERE usopen_2018.cut = 0 AND usopen_2018.wd = 0
    ORDER BY team_total, player1, player2, player3, name
  )AS t
)AS FINAL

【问题讨论】:

    标签: mysql mariadb


    【解决方案1】:

    ORDER BY 需要移出一层。

    原因如下。 MariaDB现在遵守标准,即子选择是无序的一组行。也就是可以忽略内部的ORDER BY。 MariaDB 在最近的几个版本中已经这样做了; MySQL 在最新版本中也是这样做的。

    过去,MySQL 和 MariaDB 盲目地执行用户请求的任何ORDER BY。然后将结果按顺序输入到查询的下一个阶段。

    限制技巧

    如果这不起作用,请在最里面的SELECTORDER BY 之后添加LIMIT 99999999。这应该可以防止优化器忽略ORDER BY,而实际上并没有做任何“限制”。

    【讨论】:

    • 谢谢,我会尝试重新安排我的查询,看看是否能正常工作。我确实尝试过,但没有得到所需的结果集。
    • @Alan - 我添加了另一种方法。
    猜你喜欢
    • 2021-10-01
    • 1970-01-01
    • 2017-02-11
    • 2014-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多