复杂删除MYSQL

时间:2018-07-01 15:55:50

标签: mysql sql

我需要删除除了日期和名字最大的数字以外的数字

CREATE TABLE IF NOT EXISTS `test_1m` (
  `name` varchar(11) NOT NULL,
  `rate` varchar(15) NOT NULL,
  `dt` datetime NOT NULL
) DEFAULT CHARSET=utf8;
INSERT INTO `test_1m` (`name`, `rate`, `dt`) VALUES
('kurkuma', '0.00002150', '2018-04-06 12:04:01'),
('kurkuma', '0.00002151', '2018-04-06 12:04:02'),
('kurkuma', '0.00002152', '2018-04-06 12:04:03'),
('kurkuma', '0.00002153', '2018-04-06 12:04:04'),
('kurkuma', '0.00002159', '2018-04-06 12:04:05'),
('kurkuma', '0.00002154', '2018-04-06 12:04:06'),
('kurkuma', '0.00002155', '2018-04-06 12:04:07'),
('kurkuma', '0.00002156', '2018-04-07 12:04:08'),
('kurkuma', '0.00002157', '2018-04-07 12:04:09'),
('pahlava', '0.0000001', '2018-04-06 12:04:02'),
('pahlava', '0.0000002', '2018-04-07 12:04:02');

必须

('kurkuma', '0.00002159', '2018-04-06 12:04:05'),
('kurkuma', '0.00002157', '2018-04-07 12:04:09'),
('pahlava', '0.0000001', '2018-04-06 12:04:02'),
('pahlava', '0.0000002', '2018-04-07 12:04:02');

也许是这样的。只是不起作用=)

DELETE * FROM `test_1m`
WHERE NOT (
    SELECT max(rate)
    FROM `test_1m`
    GROUP BY `name`, DATE(`dt`)
)

1 个答案:

答案 0 :(得分:2)

在MySQL中,您必须使用join在同一表上表示过滤:

delete t
    from test_1m t join
         (select name, date(dt) as dt, max(rate) as rate
          from test_1m
          group by name, date(dt)
         ) tt
         on tt.name = t.dt and tt.dt = t.date and
            t.rate < tt.rate;

如果这将删除大量记录(例如超过表的百分之几),则截断和重新插入可能会更快:

create temporary table tokeep as
    select t.*
    from test_1m t
    where not exists (select 1
                      from test_1m t2
                      where t2.name = t.name and
                            date(t2.dt) = date(t.dt) and
                            t2.rate > t.rate
                      );

truncate table test_1m;

insert into test_1m
    select * from tokeep;

当然,请先测试代码并备份表。