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)”。