-2

我面临一个与这个问题非常相似的问题:

MySQL存储过程只返回最后一行数据

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

所以,这里是两个涉及的表(注意:这里只有相关字段):

  • phplist_user_user : id,email
  • phplist_user_user_attribute : 属性ID、用户ID、值

使用 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`='useremail@domain.ext');

正确的令牌

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

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

返回了错误的令牌

输入错误的令牌

检查 phplist_user_user_attribute 表它等于最后一行:

表格的最后一行

这是一个标准/默认的 phplist 安装,所以我可能在我不太明白的过程中做错了什么。

感谢您的任何帮助!

4

1 回答 1

1
WHERE `email`=email

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

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

于 2020-08-13T11:40:54.167 回答