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

Mysql 将值从一个字段复制到子集内的另一个字段,mysql,sql,Mysql,Sql,我正试图创建一个查询,但我被卡住了 上下文 在我的网站上,用户的个人资料上有不同的字段。其中一个字段是新闻稿的复选框。现在我们将制作第二份时事通讯。订阅新闻稿的每个用户都将自动订阅第二个新闻稿,并可以选择取消订阅。未订阅原始新闻稿的用户也不应收到第二份新闻稿 表格 这些字段存储在“Profile_field”表中。此表有3列 fid=>字段Id(可以是配置文件名称、地址、新闻稿等) uid=>用户Id 价值观 因此,对于每个用户,我需要将field1的值复制到field2 到目前为止的查询

我正试图创建一个查询,但我被卡住了

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

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

  • fid=>字段Id(可以是配置文件名称、地址、新闻稿等)
  • uid=>用户Id
  • 价值观
因此,对于每个用户,我需要将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服务器版本相对应的手册 在第1行的“temp”附近使用的语法,其中uid=copy.uid),其中fid=37

那么,在我的查询中如何考虑用户呢

问候

Stephan Celis

如果您正在处理添加新闻稿的问题,那么我希望插入
而不是
更新
。大致如下:

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;
也就是说,为新的时事通讯插入一个新值,对于所有拥有现有时事通讯的用户。

如果您正在处理添加时事通讯的问题,那么我希望插入
而不是
更新
。大致如下:

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;

也就是说,为新的时事通讯插入一个新值,用于所有拥有现有时事通讯的用户。

对于更新,我将使用:

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  

对于更新,我将使用:

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  

我建议重新设计数据库,考虑到用户和订阅之间存在多对多关系。这是由旧的Drupal安装造成的,所以我不能。如果不是这样的话,我会同意你的看法。我建议重新设计你的数据库,以考虑到用户和订阅之间存在多对多的关系。它是由一个旧的Drupal安装来实现的,所以我不能。如果不是,我同意你的看法。我需要更新和插入。出于某种原因,从更新开始。@StephanCelis。对于您描述的问题,我看不出更新适用于何处。因为在我添加字段(以drupal的形式)和执行查询之间,某些用户可能已按下其配置文件上的“保存”按钮或创建了新配置文件。在这种情况下,在某些情况下,值将是0而不是1。我需要更新和插入。出于某种原因,从更新开始。@StephanCelis。对于您描述的问题,我看不出更新适用于何处。因为在我添加字段(以drupal的形式)和执行查询之间,某些用户可能已按下其配置文件上的“保存”按钮或创建了新配置文件。在这种情况下,在某些情况下,该值将是0而不是1。