将值从一个字段复制到子集中的另一个字段

时间:2013-08-26 12:09:10

标签: mysql sql

我正在尝试创建一个查询,但我被卡住了。

上下文 在我的网站上,用户的个人资料中有不同的字段。其中一个字段是简报的复选框。现在我们要制作第二份时事通讯。订阅时事通讯的每个用户都将自动订阅第二个用户,并可以选择取消订阅。未订阅原始简报的用户也不应收到第二份简报。

表格 这些字段存储在表“Profile_field”中。该表有3列

  • fid =>字段ID(可以是个人资料名称,地址,简报......)
  • uid =>用户标识

因此,对于每个用户,我需要将field1的值复制到field2

到目前为止的查询

UPDATE profile_values AS copy
SET value =
   (SELECT value
    FROM ( Select Value
           FROM profile_values as original
           WHERE fid = 12
         ) AS temp
   )
WHERE fid=37
;

现在这给了我错误:

  

错误1242(21000):子查询返回超过1行

我理解为什么我有这个。这是因为在我的子查询中,我没有考虑到一个字段因不同的用户而返回多个结果。换句话说,我不会考虑用户。

所以我试过像

这样的东西
FROM ( Select Value
           FROM profile_values as original
           WHERE fid = 12
         ) AS temp
WHERE uid=copy.uid

但这也不起作用。

  

错误1064(42000):您的SQL语法有错误;检查   手册,对应右边的MySQL服务器版本   在'“temp”附近使用的语法WHERE uid = copy.uid)其中fid = 37'在第1行

那么如何在查询中考虑用户?

热烈的问候

Stephan Celis

2 个答案:

答案 0 :(得分:3)

对于更新,我会使用:

UPDATE profile_values pv
       JOIN (SELECT value,
                    uid
             FROM   profile_values
             WHERE  fid = 12) AS current_field_values
         ON current_field_values.uid = pv.uid
SET    pv.value = current_field_values.value
WHERE  pv.fid = 37  

答案 1 :(得分:0)

如果您正在处理添加简报,那么我希望insert而不是update。有点像:

insert into profile_values(uid, fid, value)
    select uid, 37, 1
    from profile_values pv
    group by uid
    having max(fid = 12 and value = 1) > 0;

即为所有拥有现有简报的用户插入新简报的新值。