多行输出到MySQL中的变量

时间:2014-07-02 13:59:00

标签: 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;

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

3 个答案:

答案 0 :(得分:2)

错误意味着当您尝试将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(SELECT id                    来自用户                    在哪里dateOfBirth =' 1975-02-28');

答案 1 :(得分:0)

如果有多个此类条目,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)。

我倾向于认为这很可能是真的。在任何情况下,正如您在我的答案的第一部分所看到的那样,在这种特定情况下,您实际上并不需要通过变量。

答案 2 :(得分:0)

问题是子查询返回的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';