【发布时间】: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