【问题标题】:Mysql - How to return more than 1 row for stored procedureMysql - 如何为存储过程返回超过 1 行
【发布时间】:2015-01-19 22:34:00
【问题描述】:

帮助我需要关于我正在尝试创建的存储过程的帮助。

我希望通过用户名退回所有礼品卡的程序,该用户名将在 3 周 (21) 天内过期。

我已经尝试了从 GROUP_CONCAT 到 Cursor 的所有方法,但它一直在告诉我

Error Code: 1242. Subquery returns more than 1 row

这是我的存储过程

CREATE DEFINER=`giftcard`@`%` PROCEDURE `CheckExpiryDate`(IN username 
VARCHAR(24))
BEGIN

Declare LoginID INT;
Declare UserID INT;

SET LoginID = (SELECT LoginID From Login WHERE `UserName` = username);
SET UserID = (SELECT UserID From User WHERE `User`.`LoginID` = LoginID);

SELECT * FROM Giftcard WHERE DATEDIFF(ExpiryDate, now()) <= 21 AND `Giftcard`.`UserID` = UserID;

END

我想要这样的东西 http://tinypic.com/r/2u7t8q9/8 但只是在参数中使用来自给定用户名的特定用户 ID。

【问题讨论】:

  • 您确定您的LoginIDUserID 查询只返回一行吗?
  • @user3896882 我想看看如果您将LoginIDUserID 都包装在max() 函数中,错误是否会消失,例如:SET LoginID = (SELECT max(LoginID) from Login WHERE UserName = username);。您的错误是引用了一个子查询,并且您的两个子查询都没有“保证”返回单行,这可能是数据库所抱怨的。
  • @Dan 这行不通,因为每个用户都有不同的 loginId 请参阅tinypic.com/r/dfin1f/8
  • 这项工作虽然 CREATE DEFINER=giftcard@%` 程序 CheckExpiryDate(IN userid int(24)) BEGIN SELECT * FROM Giftcard WHERE DATEDIFF(ExpiryDate, now()) Giftcard.UserID = 用户 ID; END`

标签: mysql sql stored-procedures subquery procedure


【解决方案1】:

您无法解决问题,因为您试图在不了解数据的情况下修复 SQL。

尝试修复子查询返回多个值的技巧是找到它将返回的实际值并确定如何只返回一个。它可能是通过一个聚合函数、一个附加的 where 子句,或者它可能意味着您想要所有记录,因此根本不能使用子查询。这些是业务规则选择,我们无法为您提供帮助。

您上面查询的 dateadiff 部分不是子查询,所以我很困惑为什么您认为这是问题所在。如果您将选择放入只是为了显示如果您正在运行实际上具有子查询的其他代码会产生什么结果,那么您可以查看该数据以确定您想要什么。如果您想要所有这些,那么您需要使用子查询更改代码以使用连接而不是子查询。如果您只想要一个,您需要确定哪个条件或聚合函数可以为您提供所需的记录。

【讨论】:

    【解决方案2】:

    现在可以按我的意愿工作了

    CREATE DEFINER=`giftcard`@`%` PROCEDURE `CheckExpiryDate`(IN un VARCHAR(24))
    BEGIN
    
    DECLARE lid INT;
    DECLARE uid INT;
    SET lid = (SELECT LoginID FROM Login WHERE UserName = un);
    SET uid = (SELECT UserID FROM User WHERE LoginID = lid);
    
    SELECT * FROM Giftcard WHERE DATEDIFF(ExpiryDate, now()) <= 21 AND `Giftcard`.`UserID` = uid; 
    
    END
    

    【讨论】:

    • 我认为它通过调用相同的给定名称声明和参数感到困惑
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-13
    • 2021-08-29
    • 2014-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多