使用mysql用户定义的函数来计算美元金额。错误1064(42000)

问题描述:

我正在尝试创建一个mysql函数来计算商店中前五位客户所花费的总额,但我一直收到以下语法错误。什么导致了错误? 错误:使用mysql用户定义的函数来计算美元金额。错误1064(42000)

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that 
corresponds to your MySQL server version for the right syntax to use near 
'FUNCTION costofbestbuyers (totalspent DECIMAL) 
RETURNS DOUBLE 
BEGIN 
    DECLA' at line 1 

功能:

DELIMITER // 
CREATE FUNCTION topfivespenders (totalspent DECIMAL) 
RETURNS DOUBLE 
BEGIN 
    DECLARE totalspent DOUBLE DEFAULT 0; 

    SELECT sum(ordercost) AS totalspent 
     FROM customer c JOIN orders o 
     ON c.customerID = o.cID 
     GROUP BY o.cID 
     ORDER BY totalspent desc 
     LIMIT 5; 

RETURN totalspent; 
END; // 

语法不正确设置的sum(ordercost)值成totalspent变量。

试试这个。希望这可以工作。

DELIMITER // 
CREATE FUNCTION topfivespenders (totalspent DECIMAL) 
RETURNS DOUBLE 
BEGIN 
    DECLARE totalspent DOUBLE DEFAULT 0; 

    SELECT sum(ordercost) INTO totalspent 
     FROM customer c JOIN orders o 
     ON c.customerID = o.cID 
     GROUP BY o.cID 
     ORDER BY totalspent desc 
     LIMIT 5; 

RETURN totalspent; 
END// 
DELIMITER // 

既然你得到了一个语法错误,那么你会尝试在phpMyAdmin或API中执行此操作。您不需要在这些环境中执行DELIMITER技巧。当您使用mysql客户端执行SQL语句或SQL脚本时,您只需要DELIMITER。看到这个问题的答案:Creating functions in phpMyAdmin - Error: access denied you need the super privilege for this operation

除此之外,我看到你的函数的一些其他问题。如果您没有成功定义函数,您还没有遇到这些问题。

  • MySQL存储的函数只能返回一个标量,而不是结果集。您试图返回最多五个分组总和的结果集。

  • 你的ORDER BY子句是由你给没有价值,除了默认的0值的局部变量totalspent这意味着你的ORDER BY子句将在一个恒定值,这使得每行的排序顺序并列顺序排序。这就好像你没有排序顺序一样,MySQL将以某种任意的方式排序行。