MySQL中多行输出为变量

MySQL中多行输出为变量,mysql,subquery,mysql-error-1242,Mysql,Subquery,Mysql Error 1242,以下查询似乎仅在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; 我得到的确切错

以下查询似乎仅在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;

我得到的确切错误是:错误代码:1242子查询返回多行。

如果有多个这样的条目,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上找到这些答案的几个示例,例如:


我倾向于相信这很可能是真的。在任何情况下,正如我回答的第一部分所示,在这种特殊情况下,实际上不需要遍历变量。

该错误意味着您在尝试将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的用户的所有地址

SELECT @id:=(SELECT id
             FROM USER
             WHERE dateOfBirth='1975-02-28');
DELETE FROM Address
WHERE user_id=@id;
正如Tonio所说,将您的删除查询更改为他的建议,它就会起作用

从地址中删除 在“选择id”中的“用户id”位置 来自用户 其中出生日期为1975-02-28'


问题是子查询返回的ID不止一个,如果您只需要一个ID,那么应该限制在子查询末尾声明limit 1的结果

另一方面,联接为问题提供了更好的解决方案:

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

你能提供更多的信息吗?这怎么会失败呢?这是mySQL错误还是程序错误?如果要将此查询的结果存储在数组中,您使用的是什么编程语言/环境?您能提供错误时失败的确切行吗?请考虑表格,而不是数组。您正在使用SQL。对于下面的查询,请选择@ids:=从用户处选择id,其中dateOfBirth='1975-02-28';我得到了以下错误代码:1242子查询返回的行数超过1行。@Raju您能告诉我您是否仍然有问题,或者您的问题是否得到了回答吗?如果是,请标出答案?我们无法用sql变量得出结论。所以我们只需要使用子查询来解决这个问题。我想就是这样。然而,我的意思是,这是一个问答网站。如果您对某个答案感到满意,您可以单击该答案投票下方的右勾,将其标记为问题的答案。