Mysql - 如何 return 超过 1 行的存储过程

Mysql - How to return more than 1 row for stored procedure

帮助我需要有关我正在尝试制作的存储过程的帮助。

我想要程序 return 一个用户名的所有礼品卡,将在 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。

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

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

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

如我所愿,现在可以正常工作了

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