SQLyog 函数:从 INNER JOIN 返回值时出现语法错误

SQLyog Function: Syntax error when returning values from INNER JOIN

我正在编写一个 SQLyog 函数来根据客户花费的金额查找客户的状态。他们花费的金额位于付款 table 中,所有客户详细信息位于客户 table.

编辑:请注意,当输出仅为 CustStatus 时,该函数有效,似乎问题与包含其他 return 值有关。

这是我收到的错误:

Error Code: 1064 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 ' VARCHAR(50), VARCHAR(50), VARCHAR(10) DETERMINISTIC

BEGIN DECLARE k1 INT(11' at line 2

DROP FUNCTION IF EXISTS DTC_VIP_members $$
CREATE FUNCTION DTC_VIP_members (v1 INT(11))
RETURNS INT(11), VARCHAR(50), VARCHAR(50), VARCHAR(10) DETERMINISTIC 
BEGIN 
DECLARE k1 INT(11);
DECLARE CustStatus VARCHAR(10);
SELECT SUM(payment.SaleAmt) INTO k1
FROM payment
INNER JOIN clients
ON payment.client_id = clients.client_id
WHERE payment.client_id = v1;
IF k1 >= 300 THEN
    UPDATE clients  
    SET clients.CustStatus = 'VIP';
ELSE
    UPDATE clients  
    SET clients.CustStatus = 'Non-VIP';
END IF;
RETURN clients.client_id, clients.first_name, clients.last_name, clients.CustStatus;
END $$

DELIMITER ;

抱歉,您的方法看起来不对。

首先:我建议使用 STORED PROCEDURE 而不是 FUNCTION

其次:使用没有 WHERE 条件的 UPDATE 语句会导致更新 table 中的所有行,这似乎也是错误的。

所以我们的存储过程可以看起来像:

DROP PROCEDURE IF EXISTS DTC_VIP_members $$
CREATE PROCEDURE DTC_VIP_members (v1 INT(11))
BEGIN 
    DECLARE k1 INT(11);
    DECLARE CustStatus VARCHAR(10);

    SELECT SUM(payment.SaleAmt) INTO k1
    FROM payment
    INNER JOIN clients
    ON payment.client_id = clients.client_id
    WHERE payment.client_id = v1;

    IF k1 >= 300 THEN
        UPDATE clients  
        SET clients.CustStatus = 'VIP'
        WHERE clients.client_id = v1; -- update only one record
    ELSE
        UPDATE clients  
        SET clients.CustStatus = 'Non-VIP'
        WHERE clients.client_id = v1; -- update only one record
    END IF;

    -- select relevant data
    SELECT 
        clients.client_id, clients.first_name, clients.last_name, clients.CustStatus 
    FROM clients
    WHERE clients.client_id = v1;
END $$

DELIMITER ;

已解决! 感谢您花时间查看和回复 Slava! 是的,您的方法是一个更好的设计,并且可能会出现我所有愚蠢的 SQL 语法错误。 我了解到,在 SQLyog 服务器版本中,我正在处理函数只能 RETURN 一个值。所以我的设计从一开始就存在缺陷。

因为SQLyog函数只能return单值“vip”或“non-vip”。 我尝试使用 select 来达到预期的效果。 Select 名字,姓氏,...。 DTC_VIP_members(….);

希望这个答案能帮助任何其他尝试从 SQLyog 免费版本学习 SQL 的初学者。 左上角

   DELIMITER $$

    DROP FUNCTION IF EXISTS `DTC_VIP_members`$$ 

    CREATE DEFINER=`yadda`@`%` FUNCTION `DTC_VIP_members`(v1 INT(11)) RETURNS VARCHAR(10) CHARSET latin1 
        DETERMINISTIC 
    BEGIN 
        DECLARE k1 INT(11); 
        DECLARE CustStatus VARCHAR(10); 
        SELECT SUM(SaleAmt) INTO k1 
        FROM payment 
        WHERE client_id = v1; 
        IF k1 >= 300 THEN
            SET CustStatus = 'VIP'; 
        ELSE
            SET CustStatus = 'Non-VIP'; 
        END IF;
        RETURN CustStatus; 
        END$$

    DELIMITER ;

    --------------------------------------

    SELECT  first_name, last_name, email, mobile_number, `DTC_VIP_members`(client_id) 
    FROM clients;