带有子查询的 MySql 函数上的语法错误

Syntax error on MySql Function with subquery

提问人:Fizik26 提问时间:11/15/2023 更新时间:11/15/2023 访问量:35

问:

当我创建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

我不明白我做错了什么。你有解释吗?

MySQL 函数

评论


答:

1赞 Bill Karwin 11/15/2023 #1

VARCHAR需要长度规范,例如 .VARCHAR(20)

修复此问题后,您还将在函数中遇到另一个错误。MySQL 中的函数只能返回一个标量,但查询返回两列和 .SELECTplayer_idL10

过程可以返回包含多列的多行的结果集,但不能返回函数。


我使用 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