【问题标题】:Row Number is not allowed under MySQL 8 verMySQL 8 版本下不允许行号
【发布时间】:2021-06-22 13:28:40
【问题描述】:

谁能帮我创建一个可以在 MySQL 8 下运行的 SQL 查询。目前,这个查询在我的本地主机上运行,​​但是当传输到 Live 时显示错误。

此查询从 10 到 1 对赛车手进行评分(第 1 名 = 10 分,第 10 名 = 1 分),在星期一午夜自动运行。

这是示例表:

CREATE TABLE `tbl_race_has_list` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
 `group_name` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
  `timer` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `weekly_score`  SMALLINT NOT NULL DEFAULT 0,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

$sql = "UPDATE tbl_race_has_list
    INNER JOIN 
    (
            SELECT *, ROW_NUMBER() OVER (order by timer ASC) AS RacerRank
            FROM tbl_race_has_list
            WHERE DATE(created)
                BETWEEN DATE_SUB(DATE(now()), INTERVAL (WEEKDAY(now()) - 1 + 7) % 7 DAY)
                AND DATE_ADD(DATE(now()), INTERVAL 6 - (WEEKDAY(now()) - 1 + 7) % 7 DAY)
            ORDER BY timer ASC LIMIT 0, 10
    ) c
        ON racerTime.tbl_race_has_list.id = c.id
    SET racerTime.tbl_race_has_list.weekly_score = 11 - c.RacerRank";

更新。我创建了一个可以在 MySQL 8 版本以下运行的 SQL 查询。它按预期工作,但我愿意接受更好的方法。

UPDATE tbl_race_has_list
    INNER JOIN 
    (
            SELECT *, (@row_number := @row_number + 1) AS RacerRank
            FROM tbl_race_has_list
            (SELECT @row_number := 0) AS x
            WHERE DATE(created)
                BETWEEN DATE_SUB(DATE(now()), INTERVAL (WEEKDAY(now()) - 1 + 7) % 7 DAY)
                AND DATE_ADD(DATE(now()), INTERVAL 6 - (WEEKDAY(now()) - 1 + 7) % 7 DAY)
            ORDER BY timer ASC LIMIT 0, 10
    ) c
        ON racerTime.tbl_race_has_list.id = c.id
    SET racerTime.tbl_race_has_list.weekly_score = 11 - c.RacerRank

【问题讨论】:

  • 我认为这在标题中,因为 ROW_NUMBER() 是在 MySQL 8 中引入的。
  • 在 Live PHPmyadmin 上运行此查询后。这是错误:查询中的错误(1064):'(按计时器 ASC 排序)AS RacerRank FROM tbl_race_has_list WHERE DATE(creat' at line 1) 附近的语法错误
  • 致 OP:MySQL 的 dev 和 prod 主要版本之间的不兼容性比仅仅缺少 ROW_NUMBER 函数有更多的扩展后果。您必须同步这些:通过升级 prod 数据库(是的,我知道这是一项艰巨的任务)或通过降级开发中使用的数据库。
  • 我怀疑您使用的是 MySQL 8。也许您使用的是 MySQL 8 客户端,但您描述的错误表明您的 MySQL 服务器不是 MySQL 8,这就是SQL 支持的重要部分。你能运行SELECT VERSION(); 并报告结果吗?
  • 负责该生产服务器的人员应注意升级。那个版本的 MariaDB 已经很老了,一年前对 Debian Stretch 的常规支持就结束了

标签: mariadb window-functions mariadb-10.1


【解决方案1】:

您在问题开头显示的代码在 MySQL 8.0 中应该可以正常工作。

但我们在上面的评论线程中了解到,您根本没有使用 MySQL,您使用的是 MariaDB。 MariaDB 不是 MySQL。它于 2010 年从 MySQL 分叉出来,从那时起逐渐变得越来越不兼容。我们现在应该将 MariaDB 视为一种不同的产品,而不是他们曾经声称的 MySQL 的直接替代品。

在您的生产服务器上,您使用的是 MariaDB 10.1,它太旧,无法支持窗口函数。查看他们的文档:https://mariadb.com/kb/en/window-functions/

窗口函数最早是在 MariaDB 10.2.0 中引入的。

确保您的开发环境具有与您的完整技术堆栈的所有组件完全相同的版本是一个好习惯。否则,您会冒这种情况发生的风险,开发一些依赖于较新功能的代码,然后在部署到生产环境时发现代码无法正常工作。

您应该坚持更新您的生产服务器。据https://endoflife.date/mariadb报道,MariaDB 10.1 于 2020 年 10 月结束生命周期。

如果做不到这一点,请尝试找到一个 MariaDB 10.1 版本以安装在您的开发中。这可能需要一些创造性的搜索,因为 10.1 已从官方下载站点中删除:https://mariadb.com/downloads/

【讨论】:

    猜你喜欢
    • 2015-04-17
    • 2012-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-28
    • 2014-06-09
    • 1970-01-01
    • 2019-07-12
    相关资源
    最近更新 更多