【问题标题】:Updating a row based on number of existing records根据现有记录的数量更新行
【发布时间】:2020-10-14 23:41:54
【问题描述】:

我正在尝试根据多次出现的值更新用户表中的行数。在这种情况下,它是用户电子邮件 - 因为用户可以注册此应用程序中托管的多个网站。

UPDATE users SET email = REPLACE(email,'@', CONCAT('+',user_id,'@')) 
WHERE user_id IN (
  SELECT user_id FROM users HAVING COUNT('email') > 1
);

这个查询给了我以下错误;

ERROR 1093 (HY000): You can't specify target table 'customer_entity' for update in FROM clause

我尝试了许多变体,但似乎没有一个有效。

【问题讨论】:

  • 不行,因为我正在统计结果,所以不能使用 join 方法。子查询也不起作用并给出;错误 1140 (42000):在没有 GROUP BY 的聚合查询中,SELECT 列表的表达式 #1 包含非聚合列 'db.users.user_id';这与 sql_mode=only_full_group_by 不兼容
  • 响应“否”不适用于此处;)在我引用的两个链接之间至少有十几个好的建议。尝试其中一些,然后发回您的结果以及您可能遇到的任何其他问题。
  • '这能回答你的问题吗?'。否肯定是一个有效的回应。正如我所提到的,我已经查看了这两个并尝试了这些建议。还是谢谢你

标签: php mysql join count sql-update


【解决方案1】:

MySQL 不支持这种语法。相反,您可以自行加入聚合查询:

UPDATE users u
INNER JOIN (SELECT user_id FROM users GROUP BY user_id HAVING count(email) > 1) u1
ON u1.user_id = u.user_id
SET u.email = REPLACE(e.email,'@', CONCAT('+', u.user_id, '@'))

【讨论】:

  • 这符合我的 0 行
【解决方案2】:

我引用的两个链接有很多很好的建议,GMB 的建议听起来也很有希望。

问:您是否真的看过这些(多种不同的!)替代方案,并使用您的数据集亲自尝试过它们?发生了什么?

建议(以 GMB 为例):

  1. 验证选择是否有效(返回一行或多行):

    SELECT user_id FROM users GROUP BY user_id HAVING count(email) > 1)

  2. 结合“更新”和“加入”(不同的语法):

    UPDATE users u1
    SET u1.email = REPLACE(e.email,'@', CONCAT('+', u1.user_id, '@'))
    INNER JOIN users u2
      ON u1.user_id = u2.user_id
    GROUP BY u2.user_id HAVING count(u2.email) > 1;
    

请告诉我们结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-12
    • 1970-01-01
    • 2019-02-02
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    • 2018-11-24
    • 1970-01-01
    相关资源
    最近更新 更多