mariadb总是从存储过程返回最后一行

问题描述

我正面临着与此问题非常相似的问题:

MySQL stored procedure only returns last row of data

首先让我解释一下情况。 我正在使用PHPlist,并且创建了一个自定义属性,用作“每个用户令牌”;它用于创建自定义的退订链接。 有时,我需要手动知道用户的电子邮件地址来获取此类令牌。

因此,这是两个涉及的表(注意:此处仅相关字段):

  • PHPlist_user_user :ID,电子邮件
  • PHPlist_user_user_attribute :attributeid,userid,value

使用dbeaver ide,执行以下查询,即可正确获取用户令牌:

SELECT value AS token FROM PHPlist_user_user_attribute WHERE attributeid=3 and userid=(SELECT MAX(`id`) FROM PHPlist_user_user WHERE `email`='[email protected]');

Corect token

如果我将此查询放入存储过程中,则无论电子邮件是否正确,它总是返回最后一个令牌插入表中>

CREATE DEFINER=`root`@`%` PROCEDURE `PHPlist`.`GetTokenFromEmail`(IN `email` VARCHAR(255))
BEGIN
    
    SELECT value AS token 
    FROM PHPlist_user_user_attribute 
    WHERE attributeid=3 
      and userid=(SELECT MAX(`id`)  
                  FROM PHPlist_user_user 
                  WHERE `email`=email);

END

Wrong token returned

Wrong token whatever the input

PHPlist_user_user_attribute表中检查它是否等于最后一行:

last row of table

这是标准/认的PHPlist安装,因此我可能对我不太了解的程序有误。

谢谢您的帮助!

解决方法

WHERE `email`=email

这两列均来自phplist_user_user表-因此,条件值始终为TRUE,直到phplist_user_user.email为NULL。

请记住-如果查询的行源包含多个表(包括同一表的副本的情况),则为EACH列名指定表名/别名。