0

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

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

字段存储在表“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
;

现在这给了我错误:

ERROR 1242 (21000):子查询返回多于 1 行

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

所以我尝试了类似的东西

FROM ( Select Value
           FROM profile_values as original
           WHERE fid = 12
         ) AS temp
WHERE uid=copy.uid

但这也行不通。

ERROR 1064 (42000):您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 '"temp" WHERE uid=copy.uid )where fid=37' 附近使用正确的语法

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

温暖的问候

斯蒂芬·塞利斯

4

2 回答 2

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  
于 2013-08-26T12:29:35.730 回答
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;

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

于 2013-08-26T12:17:08.390 回答