SQL:更新除每组之一外的所有行

时间:2018-11-08 13:00:32

标签: mysql sql

我有一张这样的桌子。 “邮件已发送”列的值为“ 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 |
+-------------+-----------------+------------+

1 个答案:

答案 0 :(得分:1)

您可以使用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;

Here是数据库提琴。