#mysql #sql #codeigniter #datetime #greatest-n-per-group
#mysql #sql #codeigniter #дата и время #наибольшее число на группу
Вопрос:
Основная проблема: — выберите последнюю вставленную строку на основе даты
я хочу иметь возможность выбирать отдельную строку ссылки с последней датой created_At.
это моя таблица и данные
DROP TABLE IF EXISTS `transactions_logs`;
CREATE TABLE IF NOT EXISTS `transactions_logs` (
`trans_log_Id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`etat_de_commande` varchar(100) NOT NULL,
`ref` varchar(10) NOT NULL,
`commentaire` text NOT NULL,
`staffId` bigint(20) UNSIGNED NOT NULL,
`Created_At` datetime NOT NULL,
PRIMARY KEY (`trans_log_Id`)
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=latin1;
INSERT INTO `transactions_logs` (`trans_log_Id`, `etat_de_commande`, `ref`, `commentaire`, `staffId`, `Created_At`) VALUES
(1, 'waiting confirmation', '429735061', '', 1, '2020-11-09 12:11:43'),
(2, 'waiting confirmation', '472143970', '', 1, '2020-11-09 13:45:57'),
(3, 'confirmed', '429735061', '', 1, '2020-11-09 13:46:12'),
(4, 'ready', '429735061', '', 1, '2020-11-09 13:46:18'),
(5, 'picked', '429735061', '', 1, '2020-11-09 14:46:25');
COMMIT;
Я хочу иметь возможность получить этот результат
(2,'waiting confirmation','472143970',1,'2020-11-09 13:45:57'),
(5,'picked','429735061',1,'2020-11-09 14:46:25')
Ответ №1:
Один из вариантов использует оконные функции, доступные в MySQL 8.0:
select *
from (
select t.*,
rank() over(partition by ref order by created_at desc) rn
from transactions_logs t
) t
where rn = 1
Вы также можете использовать исправленный подзапрос для фильтрации — это работает во всех версиях MySQL:
select t.*
from transactions_logs t
where t.created_at = (
select max(t1.created_at)
from transactions_logs t1
where t1.ref = t.ref
)
Последний будет использовать индекс on (ref, created_at)
.
Комментарии:
1. могу ли я добавить массив для ссылки, например «где ссылка в (массив)»
2. что вы имеете в виду
where ref in (array)
?3. я имею в виду, что я хотел бы передать массив с определенным значением, что ссылка должна быть одной из них