MYSQL查询将日期列设置为null,当前日期除外

时间:2016-03-12 17:15:10

标签: mysql

我正在研究MYSQL数据库,我遇到了一个问题。我有一个列有日期的专栏。但是,我只是在整个日期列已经填充了数据时才尝试将整列设置为null。

我尝试过:

update users set date = null where date is not null 

但是,当我这样做时,它会重置当前日期。仅当整个数据列填充数据时,如何将日期设置为空?

例如,我有一个随机名称选择器程序,用于选择随机用户。

我的表格如下:

ID名称日期 1 A
2 B
3 C

今天选择随机用户时:

ID名称日期 1 A
2 B
3 C 2016-03-12

我的代码在这种情况下运行正常。我想保留C的日期,然后明天随机选择一个人。如果我明天运行我的代码,它只会在A和B之间进行选择,并会在其名称旁边放置一个日期。例如,假设它选择了B,那么我的表格将如下所示:

ID名称日期 1 A
2 B 2016-03-13 3 C 2016-03-12

星期一,我的节目别无选择,只能选择A人,我的桌子看起来像是:

ID名称日期 2016年6月1日 2 B 2016-03-13 3 C 2016-03-12

到目前为止,我的程序运行正常。我想要的是星期二(03/15/2016)当我去运行我的随机选择器时我希望它将B和C的日期重置为Null并将A与2016-03-14保持一致以便A不会#39; t周二被选中。

2 个答案:

答案 0 :(得分:0)

我更喜欢两个步骤,但如果你必须有一个......这可能会有用。

这样做是评估记录的总记录数,当日期不为空时,它们匹配时将每条记录更新为空日期。如果它们不匹配,则将日期字段设置为等于现有日期字段。

也许这......(未经测试)

Update users u set u.`date` = NULL
where u.ID exists 
(Select 1 
 from users iu
 where (Select count(*) from users) = (Select count(*) from users where `date` is not null)
 and u.id = iu.id)

每次触及每条记录......我更喜欢两个步骤,因为它只在需要时触及记录。

两个步骤:

  1. select count(*) cnt from users where date is null;
  2. 如果cnt = 0则update users set date = null;

答案 1 :(得分:0)

此查询应在所有行上将日期设置为null,但具有当前日期的行除外,并且仅当所有日期行都已设置时:

    UPDATE users u
    JOIN    (
        SELECT count(id) nulls
        FROM users
        WHERE date IS NULL
        ) cnt
    SET u.date = NULL
    WHERE u.date != DATE(NOW())
    AND cnt.nulls = 0;
相关问题