【问题标题】:mariadb always returning last row from stored proceduremariadb 总是从存储过程返回最后一行
【发布时间】:2020-08-13 11:26:03
【问题描述】:

我遇到了一个与这个问题非常相似的问题:

MySQL stored procedure only returns last row of data

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

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

  • phplist_user_user: id,email
  • 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`='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 安装,所以我可能对我不太明白的程序做错了什么。

感谢您的帮助!

【问题讨论】:

    标签: mysql stored-procedures mariadb phplist


    【解决方案1】:
    WHERE `email`=email
    

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

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

    【讨论】:

    • 该死的......我来自sql server world,我曾经将参数命名为与字段相同的名称,没有任何问题......我没有注意到它。我重命名了参数,它正在工作,谢谢!
    • @Squiffy 重命名参数是安慰剂。在复合语句中始终使用规则 - 列名始终带有表别名,如果没有表别名,则这是局部变量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多