提问人:Fizik26 提问时间:11/15/2023 更新时间:11/15/2023 访问量:35
带有子查询的 MySql 函数上的语法错误
Syntax error on MySql Function with subquery
问:
当我创建MySQL函数时,我被阻止了。
这是我目前的表格:
stats_nba
表(我只是我拥有的几个数据示例:
+----------+------------+-----------+
|GAME_TIME | SCORE | PLAYER_ID |
+----------+------------+-----------+
|2023-11-12| 1 | 444444 |
|2023-11-12| 1 | 111111 |
|2023-11-11| 2 | 111111 |
|2023-11-10| 3 | 111111 |
|2023-11-10| 4 | 444444 |
|2023-11-10| 5 | 555555 |
|2023-11-10| 6 | 666666 |
... ... ...
这是我无法创建的SQL函数: 该函数的目标是返回玩家最后 10 场比赛的平均分数(基于player_id函数中称为玩家)传递的函数参数
CREATE FUNCTION getAverage(player VARCHAR)
RETURNS DOUBLE
BEGIN
RETURN select s.player_id, sum(a.score)/count(a.score) as L10 from stats_nba s join ( select player_id, score from stats_nba where player_id = player order by game_time desc limit 10 ) a on s.player_id = a.player_id;
END
我有这个错误:
syntax error near ') RETURNS DOUBLE
BEGIN
RETURN select s.player_id, sum(a.score)/cou' at line 1
我不明白我做错了什么。你有解释吗?
答:
1赞
Bill Karwin
11/15/2023
#1
VARCHAR
需要长度规范,例如 .VARCHAR(20)
修复此问题后,您还将在函数中遇到另一个错误。MySQL 中的函数只能返回一个标量,但查询返回两列和 .SELECT
player_id
L10
过程可以返回包含多列的多行的结果集,但不能返回函数。
我使用 MySQL 8.2 测试了您的函数。必须将子查询放在括号中,以便它可用作标量值。
这是我的工作:
CREATE FUNCTION getAverage(player VARCHAR(100))
RETURNS DOUBLE
READS SQL DATA
BEGIN
RETURN (select sum(a.score)/count(a.score) from stats_nba s join ( select player_id, score from stats_nba where player_id = player order by game_time desc limit 10 ) a on s.player_id = a.player_id);
END
我不确定在此查询中加入的目的。我把其中的逻辑留给你。但至少语法是合法的,并且可以运行。
评论
0赞
Fizik26
11/15/2023
您好,感谢您的回答,我已经添加并删除了 select 返回的第一列。此选择现在只能返回一列和一行。但我仍然有和以前一样的问题:(VARCHAR(100)
s.player_id
0赞
Bill Karwin
11/15/2023
与您在上面发布的错误消息相同?
0赞
Fizik26
11/15/2023
是的syntax error near 'select sum(a.score)/count(a.score) as L10 from stats_nba s join ( select player_' at line 4
0赞
Fizik26
11/15/2023
感谢您的回答(我看到您编辑了您的回复),也许我使用的是太旧版本的 MySQL(目前为 5.7.31,但我仍然有一个问题:.奇怪。syntax error near ' ' at line 5
2赞
Bill Karwin
11/15/2023
我不知道你在尝试什么代码。值得一提的是,这里有一个 dbfiddle 演示它在 MySQL 5.7 上工作: dbfiddle.uk/MC9QENmF 我不得不删除该块,因为 dbfiddle 接口不支持 DELIMITER。这是有效的,因为函数的主体只是一个语句,所以它不需要代码块。BEGIN/END
评论