当我创建一个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场比赛的平均分数(基于传入该函数的参数的PERAYER_ID(在函数中调用的PERAYER

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

我不知道我做错了什么.你有什么解释吗?

推荐答案

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

一旦修复了该错误,您的函数中还会遇到另一个错误.MySQL中的一个函数只能返回单个标量,但是您的SELECT查询返回两列:player_idL10.

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


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

我不确定此查询中联接的用途.我会把这个问题的逻辑留给你.但至少语法是合法的,而且它可以运行.

Mysql相关问答推荐

在mySQL中使用子查询和WHERE子句的JOIN

含有子查询的MySQL函数出现语法错误

MySQL-如何检测时间戳中的一天

MySQL全文索引和不区分大小写搜索带来的挑战

根据日期重叠转换表格

为什么Mysql会根据查询参数改变查询执行计划?

将递归 CTE 结果合并到辅助 SQL Select

Mysql 查询返回未定义的 node.js

生成直到 10 的平方数序列

连接两个表.使用连接列作为分组依据,然后根据时间戳 Select 最新行

MySQL 将分组 JSON Select 转换为单个 JSON 对象

SQL从字典中的键获取值

MySQL 视图

如何在mysql select查询中获取两个日期之间的日期列表

我如何决定何时使用右连接/左连接或内连接或者如何确定哪个表在哪一侧?

MAMP mysql 服务器无法启动.没有mysql进程正在运行

将 MySQL 数据库置于版本控制之下?

mysql错误'TYPE = MyISAM'

MySQL合并两列并添加到一个新列中

如何从邮箱地址中 Select 域名