0

有人可以帮我创建一个可以在 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
4

1 回答 1

2

您在问题开头显示的代码在 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/

于 2021-06-23T13:42:10.363 回答