【问题标题】:mysql update groupwise maxmysql更新分组最大值
【发布时间】:2011-08-08 07:42:51
【问题描述】:

我有下表

 CREATE TABLE `data` (
`acquire_time` decimal(26,6) NOT NULL,
`sample_time` decimal(26,6) NOT NULL,
`channel_id` mediumint(8) unsigned NOT NULL,
`value` varchar(40) DEFAULT NULL,
`status` tinyint(3) unsigned DEFAULT NULL,
`connected` tinyint(1) unsigned NOT NULL,
PRIMARY KEY (`channel_id`,`acquire_time`),
UNIQUE KEY `index` (`channel_id`,`sample_time`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

对于每个channel_id,我想找到具有最长获取时间的行并将值更改为NULL,状态为NULL并连接到0。这可能吗?手册说您不能更新表并在子查询中从同一个表中进行选择...

感谢您的宝贵时间。

【问题讨论】:

    标签: mysql groupwise-maximum


    【解决方案1】:

    试试这个。

    update data data_1
    set value = null, status = null
    where not exists (
        select 1
        from data data_2
        where data_2.channel_id = data_1.channel_id
        and data_2.acquire_time > data_1.acquire_time 
    )
    

    如果这不起作用,试试这个:

    update data as data_1
    left join data as data_2
    on data_2.channel_id = data_1.channel_id
    and data_2.acquire_time > data_1.acquire_time
    set data_1.value = null, data_1.status = null
    where data_2.acquire_time is null
    

    【讨论】:

    • 第一个给出:你不能在FROM子句中指定目标表'data_1'进行更新。
    • 感谢您的帮助!抱歉,我拿了 Richard 的,对我来说它是如何工作的更清楚一点,但我认为这里的第二个也可以。
    【解决方案2】:
    update data join
    (
        select channel_id, max(acquire_time) acquire_time
        from data
        group by channel_id
    ) x on x.channel_id = data.channel_id and x.acquire_time = data.acquire_time
    set
        value = null,
        status = null,
        connected = 0
    

    【讨论】:

      猜你喜欢
      • 2018-12-04
      • 1970-01-01
      • 2018-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-19
      • 1970-01-01
      相关资源
      最近更新 更多