MYSQL:SELECT latest date per group per group

xvw2m8pv  于 11个月前  发布在  Mysql
关注(0)|答案(1)|浏览(131)

我有一个脑筋急转弯在这一个。我已经搜索了,但我发现的一切工程找到最新的1组。而不是一组中的一组。
我有一个表,其标题如下:

  • 身份证|车辆id|类型的清洁|日期 *

每个ID都是唯一的。大约有25个不同的车辆ID,可以在那里超过1次。有3种类型的清洁,当然还有日期。这个想法是,每次车辆得到清洁,这是登记在一个新的记录。例如:车辆110在10月1日进行内部清洁。如果我在10月25日对车辆110进行另一次内部清洁,则添加新记录,因此我们有数据库记录了所有的清洁情况
为了快速查看每种清洁类型的车辆已被清洁,我需要1个查询,它给我一个数组,告诉我车辆编号,类型和最新日期。
我尝试了不同的选择和最接近我来了:

SELECT * 
FROM cleanings
GROUP BY vehicle_id, type
ORDER BY vehicle_id ASC, date DESC;

字符串
这给出了每种类型每辆车的第一次清洗日期,这通常是最早的日期。
样本数据:

INSERT INTO `cleanings` (`id`, `vehicle_id`, `employees_id`, `type`, `date`, `created`, `modified`) VALUES
(1, 15103, 1, 'Buitenkant', '2023-10-06', '2023-10-08 06:44:22', '2023-10-09 18:50:08'),
(2, 15103, 2, 'Buitenkant', '2023-10-08', '2023-10-08 06:44:34', '2023-10-09 18:54:25'),
(3, 15102, 2, 'Buitenkant', '2023-10-03', '2023-10-09 14:15:34', '2023-10-09 18:43:24'),
(4, 15101, 1, 'Buitenkant', '1989-11-10', '2023-10-09 14:22:53', '2023-10-09 17:35:17'),
(5, 15110, 2, 'Buitenkant', '2022-10-19', '2023-10-09 18:49:59', '2023-10-13 14:12:24'),
(6, 15110, 1, 'Buitenkant', '2022-10-18', '2023-10-08 04:44:22', '2023-10-13 14:12:17'),
(7, 15109, 2, 'Binnenkant', '2023-10-08', '2023-10-08 04:44:34', '2023-10-09 18:52:16'),
(8, 15116, 2, 'Binnenkant', '2023-10-03', '2023-10-09 12:15:34', '2023-10-09 18:52:16'),
(9, 15118, 1, 'Binnenkant', '1989-11-10', '2023-10-09 12:22:53', '2023-10-09 18:52:16'),
(10, 15119, 2, 'Binnenkant', '2023-10-19', '2023-10-09 16:49:59', '2023-10-09 18:52:16'),
(11, 15101, 1, 'Saniswiss', '2023-10-06', '2023-10-08 04:44:22', '2023-10-13 08:16:48'),
(12, 15103, 2, 'Saniswiss', '2023-10-08', '2023-10-08 04:44:34', '2023-10-09 18:52:59'),
(13, 15116, 2, 'Saniswiss', '2023-10-03', '2023-10-09 12:15:34', '2023-10-09 18:52:59'),
(14, 15111, 1, 'Saniswiss', '1989-11-10', '2023-10-09 12:22:53', '2023-10-09 18:52:59'),
(15, 15112, 2, 'Saniswiss', '2023-10-19', '2023-10-09 16:49:59', '2023-10-09 18:52:59'),
(16, 15105, 1, 'Buitenkant', '2023-10-09', '2023-10-09 18:58:33', '2023-10-09 18:58:33'),
(17, 15105, 2, 'Binnenkant', '2023-10-06', '2023-10-09 20:38:00', '2023-10-16 22:51:17'),
(18, 15112, 2, 'Binnenkant', '2023-12-12', '2023-10-16 22:51:32', '2023-10-16 22:51:32'),
(19, 15590, 15, 'Saniswiss', '2024-01-01', '2023-10-17 12:35:48', '2023-10-30 21:02:02'),
(21, 15101, 1, 'Buitenkant', '2023-10-20', '2023-10-17 14:46:29', '2023-10-17 14:46:29'),
(29, 15107, 15, 'Buitenkant', '2023-11-24', '2023-11-01 11:34:28', '2023-11-01 11:34:28'),
(30, 15215, 14, 'Saniswiss', '2023-11-20', '2023-11-01 11:35:32', '2023-11-01 11:35:32'),
(31, 15213, 1, 'Buitenkant', '2023-11-01', '2023-11-01 11:35:41', '2023-11-01 11:35:41'),
(32, 15118, 1, 'Binnenkant', '2023-11-02', '2023-11-02 10:02:51', '2023-11-02 10:02:51'),
(33, 15118, 1, 'Binnenkant', '2023-11-02', '2023-11-02 10:03:21', '2023-11-02 10:03:21'),
(34, 15118, 1, 'Buitenkant', '2023-11-02', '2023-11-02 10:05:08', '2023-11-02 10:05:08'),
(35, 15101, 1, 'Buitenkant', '2023-11-02', '2023-11-02 10:55:38', '2023-11-02 10:55:38');


查询结果示例:

array (size=21)
  0 => 
    array (size=7)
      'id' => int 4
      'vehicle_id' => int 15101
      'employees_id' => int 1
      'type' => string 'Buitenkant' (length=10)
      'date' => string '1989-11-10' (length=10)
      'created' => string '2023-10-09 16:22:53' (length=19)
      'modified' => string '2023-10-09 19:35:17' (length=19)
  1 => 
    array (size=7)
      'id' => int 11
      'vehicle_id' => int 15101
      'employees_id' => int 1
      'type' => string 'Saniswiss' (length=9)
      'date' => string '2023-10-06' (length=10)
      'created' => string '2023-10-08 06:44:22' (length=19)
      'modified' => string '2023-10-13 10:16:48' (length=19)
  2 => 
    array (size=7)
      'id' => int 3
      'vehicle_id' => int 15102
      'employees_id' => int 2
      'type' => string 'Buitenkant' (length=10)
      'date' => string '2023-10-03' (length=10)
      'created' => string '2023-10-09 16:15:34' (length=19)
      'modified' => string '2023-10-09 20:43:24' (length=19)


样本结束结果:

1qczuiv0

1qczuiv01#

https://dev.mysql.com/doc/refman/8.0/en/example-maximum-column-group-row.html采用LEFT JOIN方法,沿着这些行的内容可能会给予您要查找的结果。连接条件意味着,对于每一行,我们查找同一车辆和类型但日期较晚的另一行。然后,WHERE子句强制执行这样的条件,即不应存在这样的匹配行(仅当该行已经是车辆和类型组合的最新行时才为真)

SELECT c1.* 
FROM cleanings c1
LEFT JOIN cleanings c2 ON
  c1.vehicle_id = c2.vehicle_id
  AND c1.type = c2.type
  AND c2.date > c1.date
WHERE c2.ID IS NULL
ORDER BY c1.vehicle_id ASC, c1.date DESC;

字符串

相关问题