【问题标题】:Multiple rows output into variables in MySQL多行输出到 MySQL 中的变量
【发布时间】:2014-08-23 08:40:13
【问题描述】:

以下查询似乎仅在有一个 dateOfBirth 设置为 1975-02-28 的条目时才有效。

当有多个记录匹配此条件时失败。

不使用子查询是否可以删除属性dateOfBirth设置为1975-02-28的用户的所有地址?

SELECT @id:=(SELECT id
             FROM USER
             WHERE dateOfBirth='1975-02-28');
DELETE FROM Address
WHERE user_id=@id;

我得到的确切错误是:Error Code: 1242 Subquery returns more than 1 row.

【问题讨论】:

  • 您能提供更多信息吗?怎么会失败?是 mySQL 错误还是程序错误?您谈到将这个查询的结果存储在一个数组中,您使用的是什么编程语言/环境?您能否提供与错误一起失败的确切行?
  • 想想“表”,而不是“数组”。您正在使用 SQL。

标签: mysql subquery mysql-error-1242


【解决方案1】:

错误意味着当您尝试将 id 分配给变量时,您的内部查询未返回单行。

SELECT id
FROM USER
WHERE dateOfBirth='1975-02-28'

通过查询为变量赋值应该始终是单行结果。 如果要存储多列结果,可以执行以下操作:

SELECT field_1, field_2, field_3 INTO @var_a, @var_b, @var_c FROM any_table

但既然你这么问:

不使用子查询是否可以删除属性dateOfBirth设置为1975-02-28的用户的所有地址?

正如 Tonio 所说,将您的 DELETE 查询更改为他的建议,它会起作用。

从地址中删除 WHERE user_id IN(选择 id 来自用户 WHERE dateOfBirth='1975-02-28');

【讨论】:

    【解决方案2】:

    如果有多个这样的条目,SELECT 子查询将返回一个 ID 表。

    你不能让一个 ID 等于一个表。试试这个:

    DELETE FROM Address
    WHERE user_id IN (SELECT id
                      FROM USER
                      WHERE dateOfBirth='1975-02-28');
    

    编辑:

    似乎根本不可能在 MySQL 变量中存储多个值,就像在以下查询中尝试的那样:

    SELECT @ids:=(SELECT id
                  FROM USER
                  WHERE dateOfBirth='1975-02-28');
    

    这个解释主要是基于很多人写的(通常被提到“据我所知”)。

    我可以找到许多这样的答案,并且没有任何页面会反对该声明。可以在 SO 上找到这些答案的几个示例(例如:https://stackoverflow.com/a/3156565/3401018)。

    我倾向于相信这很可能是真的。无论如何,正如您在我的回答的第一部分中看到的那样,在这种特殊情况下,您实际上不需要遍历变量。

    【讨论】:

    • 对于下面的查询 SELECT @ids:=(SELECT id FROM USER WHERE dateOfBirth='1975-02-28');我收到以下错误错误代码:1242 子查询返回超过 1 行。
    • @Raju 您能否提及您是否仍有问题或您的问题是否已得到解答?如果是,请标记答案?
    • 我们不能用sql变量实现是结论。所以我们只需要使用子查询来解决这个问题。
    • 我想就是这样。然而,我的意思是这是一个Question/Answer 站点。如果您对某个答案感到满意,您可以通过单击该答案的投票正下方的勾号(stackoverflow.com/tour)“将其标记为您的问题的答案”。
    【解决方案3】:

    问题是子查询返回多个 ID,如果您只需要 1 个 ID,则应限制结果在子查询末尾声明 limit 1

    另一方面,连接提供了更好的解决方案:

    delete a from address a join user u on (a.user_id=u.id) 
    where u.dateOfBirth='1975-02-28';
    

    【讨论】:

      猜你喜欢
      • 2010-10-11
      • 2020-07-14
      • 2018-02-20
      • 2012-02-01
      • 1970-01-01
      • 2019-01-24
      • 2012-10-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多