Mysql 当最后返回一行时,为什么我得到的结果包含多行错误?
在运行以下程序时:Mysql 当最后返回一行时,为什么我得到的结果包含多行错误?,mysql,stored-procedures,Mysql,Stored Procedures,在运行以下程序时: DELIMITER $$ DROP PROCEDURE IF EXISTS `portaldb`.`is_optional_type_assigned`$$ CREATE DEFINER=`root`@`localhost` PROCEDURE `is_optional_type_assigned`(userId int, optionalPlanId int) begin if userId is not null and optionalPlanId
DELIMITER $$
DROP PROCEDURE IF EXISTS `portaldb`.`is_optional_type_assigned`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `is_optional_type_assigned`(userId int, optionalPlanId int)
begin
if userId is not null and optionalPlanId is not null then
// Will return multiple rows
select conv.FeatureName from planallocation as pa
left join subscriptioninfo as si
on si.SubscriptionId = pa.SubscriptionId
left join plans as pl
on pl.PlanId = pa.CurrentPlanId
right join conversiontable as conv
on conv.ConversionId = pl.OptionalFeatureId
where si.UserId = userId and
conv.FeatureType = 'optional' into @featureList;
// Will return single row
select conv.FeatureName from conversiontable as conv
right join plans as pl
on conv.ConversionId = pl.OptionalFeatureId
where conv.FeatureType = 'optional' and
pl.PlanId = optionalPlanId into @featureName;
if @featureName in (@featureList) then
select true as isAssigned;
else
select false as isAssigned;
end if;
end if;
end$$
DELIMITER ;
我得到:
Error Code : 1172
Result consisted of more than one row
错误。这可能是什么原因?前两个select语句的结果被分配给变量,然后在一个集合包含另一个集合时进行比较。之所以会出现错误,是因为MySQL要求被选择到变量中的查询必须只返回一行-返回零或多行会导致错误。因此,您注释的第一个查询返回多行,将导致错误 您可以将查询更改为以下内容:
select GROUP_CONCAT(conv.FeatureName) from .....
获取一个逗号分隔的列表结果&然后在该列表中搜索@featureName,但这可能取决于返回的结果数量。否则,您需要重新构造两个查询—可能是这样的(注意,我已经合并了Gordon关于参数命名的建议):
可以将其重新组织为更高效的查询,甚至是单个查询。您会遇到错误,因为MySQL要求选择到变量中的查询必须只返回一行-返回零或多行会导致错误。因此,您注释的第一个查询返回多行,将导致错误 您可以将查询更改为以下内容:
select GROUP_CONCAT(conv.FeatureName) from .....
获取一个逗号分隔的列表结果&然后在该列表中搜索@featureName,但这可能取决于返回的结果数量。否则,您需要重新构造两个查询—可能是这样的(注意,我已经合并了Gordon关于参数命名的建议):
可以将其重新组织为更高效的查询,甚至是单个查询。您的代码并不像您所想的那样。使用参数时的一条基本规则:以不同的方式命名参数,以便它们在代码中清晰可见 当你写作时:
where si.UserId = userId and
这被解释为:
where si.UserId = si.userId and
我建议您从更具可读性和实用性的:
DELIMITER $$
DROP PROCEDURE IF EXISTS portaldb.is_optional_type_assigned$$
CREATE DEFINER = root@localhost PROCEDURE is_optional_type_assigned (
in_userId int,
in_optionalPlanId int
)
BEGIN
if in_userId is not null and in_optionalPlanId is not null then
. . .
END;$$
DELIMITER ;
你的代码并没有做你认为它做的事情。使用参数时的一条基本规则:以不同的方式命名参数,以便它们在代码中清晰可见 当你写作时:
where si.UserId = userId and
这被解释为:
where si.UserId = si.userId and
我建议您从更具可读性和实用性的:
DELIMITER $$
DROP PROCEDURE IF EXISTS portaldb.is_optional_type_assigned$$
CREATE DEFINER = root@localhost PROCEDURE is_optional_type_assigned (
in_userId int,
in_optionalPlanId int
)
BEGIN
if in_userId is not null and in_optionalPlanId is not null then
. . .
END;$$
DELIMITER ;
如果(@featureList)中的@featureName起作用,
会起作用吗?目前还不起作用。如果我建议的重组有效-第二个查询结果为真/假,因此“If@featureName in(@featureList)”不是必需的。如果@featureName in(@featureList)
有效吗?目前还不起作用。如果我建议的重组有效,那么第二个查询结果为真/假,因此不需要“If@featureName in(@featureList)”。