首页 > 解决方案 > Mysql - 仅更新来自相同记录的 1 行

问题描述

我需要更新在借方列中具有相同值的行和只有具有 create_date ASC 的行,基本上是 2019-11-15

我有以下数据的交易表

table name - tbl_transactions

id     client_id     user_id    debit    add_date
1      9991101       1          7.69     2019-11-15
2      9991101       1          7.69     2019-11-30
3      9991101       2          28.9     2019-11-15
4      9991101       2          11.49    2019-11-30

现在我只想更新列“借方”和日期“2019-11-15”中具有相同值的记录

这意味着只有 id-1 会被更新。

 id     client_id     user_id    debit    add_date
 1      999110100     1          7.69     2019-11-15

我们可以在 client_id 字段中添加额外的 00,我尝试过使用下面的 sql 但似乎它不起作用

UPDATE tbl_transactions 
SET    client_id=999110100 
WHERE  id IN ( 
          SELECT   * 
          FROM     tbl_transactions 
          WHERE    client_id=9991101 
          AND      DATE(create_date)='2019-11-15' 
          GROUP BY user_id, debit HAVING COUNT(*) = 2 )

提前致谢。

标签: mysql

解决方案


Mysql 无法在 FROM 子句中指定更新的目标表。

您需要使用子查询在临时表中选择它们并更新它,

您可以使用CONCAT将您的 client_id 与00,

根据您的帖子,您需要按 created_date ASC 进行相同的借记和订单,

但是,mysql 不能只对 group 中的字段进行排序,因此您可以这样做:

UPDATE
  `tbl_transactions`
SET
  `client_id` = CONCAT(client_id, '00')
WHERE id IN (
  SELECT id FROM (
    SELECT t2.id, t2.user_id t2.created_date FROM 
    (
        SELECT id, user_id, MIN(created_date) AS created_date
        FROM tbl_transactions
        WHERE client_id=9991101
        GROUP BY user_id, debit 
        HAVING COUNT(*) >= 2
    ) AS t1
    INNER JOIN tbl_transactions AS t2
    ON t1.user_id = t2.user_id AND t1.debit = t2.debit AND t2.client_id = 9991101 AND t1.created_date = t2.created_date
    GROUP BY t2.user_id
  ) AS temp_table 
)


推荐阅读