我正在制作销售我的物品的程序。当我尝试调用它时,它会告诉我错误消息。我检查了哪一部分返回更多行,但我无法弄明白。以下是该过程的代码:
np.ones
我调用的函数是简单的函数,它返回所选字符/项的ID。
答案 0 :(得分:1)
当您在只需要一个值的上下文中调用SELECT,但SELECT在逻辑上不保证只返回一个值时,则会出现此错误。
您有六个SELECT操作:
SET pchar=(SELECT `getChar`(`pCharacterName`));
SET pitem=(SELECT `getItem`(`pItemName`));
这两个是在标量参数上调用存储函数。它们没问题,因为在这两种情况下,它只能返回一个值。
SET pitemCost=(SELECT `price` FROM `item` WHERE `item`.`item_id`=pitem);
这个SELECT可能没关系。我假设item.item_id
是该表的主键,因此它只能匹配一行(或零行)。
SET pcharMoney=(SELECT `money` FROM `character` WHERE `character`.`character_id`=pchar);
同样,假设character.character_id
是主键,这似乎没问题。
SET pcharitid=(SELECT MAX(`character_item_id`) FROM `character_item` WHERE `character_item`.`character_id`=pchar AND `character_item`.`item_id`=pitem);
这肯定只会返回一个值,因为您使用的是MAX()
,而查询中没有GROUP BY
。
IF (SELECT `item_id` FROM `character_item` WHERE `character_item`.`item_id` IN
(SELECT `item_id` FROM `item` WHERE `item`.`name`=`pItemName`)) THEN
内部子查询不需要是标量,因为它是IN()
谓词的一部分,可以与多个值进行比较。
外部查询必须是标量查询,但事实并非如此。根据您的数据,可以匹配多行,因此无法在IF()
条件下进行逻辑使用。
您可以使用SELECT MAX(item_id)...
或在查询结尾处使用...LIMIT 1
来解决此问题。
答案 1 :(得分:0)
您将必须使用您正在使用的测试数据单独运行每个函数,以确定哪一个函数返回多行。
E.g。首先运行这个:
SELECT 'getChar' ('pCharacterName')
但显然用您的测试数据替换了pCharacterName。