выберите последнюю вставленную строку на основе даты

#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. я имею в виду, что я хотел бы передать массив с определенным значением, что ссылка должна быть одной из них