Вы не можете сделать это в быстром запросе. У вас много данных.
Я бы предложил создать новую таблицу. Затем вы можете при необходимости заменить данные в первой таблице.
Возможно, наиболее эффективный способ получить 50 строк - при условии, что date
уникален для каждой room
:
select t.*
from t
where t.date >= coalesce((select t2.date
from t t2
where t2.room = t.room
order by t2.date desc
limit 1
), t.date
);
Для этого, чтобы иметь какую-то надежду на производительность, вам нужен индекс для (room, date)
.
Вы также можете попробовать row_number()
в MySQL 8 +:
select . . . -- list the columns
from (select t.*, row_number() over (partition by room order by date desc) as seqnum
from t
) t
where seqnum <= 50;
Тогда выможно заменить данные, выполнив:
create table temp_t as
select . . . -- one of the select queries here;
truncate table t; -- this gets rid of all the data, so be careful
insert into t
select *
from temp_t;
Массивные вставки намного более эффективны, чем массовые обновления, поскольку старые данные не нужно регистрировать (ни заблокированные страницы, ни другие вещи). ).