sql:更新除一个组之外的所有行

qij5mzcb  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(282)

我有一张这样的table。“mail sent”列的值为“0”或日期。

+-------------+-----------------+------------+
| Ordernumber |      Email      | Mail sent  |
+-------------+-----------------+------------+
|           1 | john.d@mail.com | 01.01.2018 |
|           2 | john.d@mail.com | 02.01.2018 |
|           3 | anne.t@mail.com |          0 |
|           4 | anne.t@mail.com | 04.01.2018 |
|           5 | anne.t@mail.com | 05.01.2018 |
|           6 | jeff.k@mail.com | 06.01.2018 |
|           7 | jeff.k@mail.com | 07.01.2018 |
|           8 | jeff.k@mail.com |          0 |
|           9 | mary.k@mail.com | 09.01.2018 |
|          10 | sam.b@mail.com  |          0 |
|          11 | sam.b@mail.com  |          0 |
+-------------+-----------------+------------+

我想更新“已发送邮件”列,以便每封邮件在“已发送邮件”中最多只有一个日期。约束:每个有日期的电子邮件的最低订单号应该保留该日期,其余的应该设置为“0”。
该表的结果应为:

+-------------+-----------------+------------+
| Ordernumber |      Email      | Mail sent  |
+-------------+-----------------+------------+
|           1 | john.d@mail.com | 01.01.2018 |
|           2 | john.d@mail.com |          0 |
|           3 | anne.t@mail.com |          0 |
|           4 | anne.t@mail.com | 04.01.2018 |
|           5 | anne.t@mail.com |          0 |
|           6 | jeff.k@mail.com | 06.01.2018 |
|           7 | jeff.k@mail.com |          0 |
|           8 | jeff.k@mail.com |          0 |
|           9 | mary.k@mail.com | 09.01.2018 |
|          10 | sam.b@mail.com  |          0 |
|          11 | sam.b@mail.com  |          0 |
+-------------+-----------------+------------+
kcrjzv8t

kcrjzv8t1#

你可以用 join :

update likethis lt join
       (select email, min(ordernumber) as minon
        from likethis
        where mailsent <> 0
        group by email
       ) lt2
       on lt.email = lt2.email
    set lt.mailsent = 0
    where lt.mailsent <> 0 and lt.ordernumber > lt2.minon;

这是小提琴。

相关问题