SELECT r1.*
FROM rentals r1
LEFT JOIN rentals AS r2
ON r1.item_id = r2.item_id
AND r1.last_change_date < r2.last_change_date
WHERE r2.last_change_date IS NULL
Это классический вопрос sql.Ответ объяснен здесь .
Используя
INSERT INTO rentals (item_id, user_id, last_change_date) VALUES (1, 1, '2009-01-01'), (1, 3, '2009-11-10'), (3, 3, '2009-02-13'), (3, 5, '2010-05-11'), (5, 5, '2010-06-04'), (7, 7, '2010-06-04'), (9, 9, '2010-06-04');
в качестве данных воспроизведения, чтобы понять метод, посмотрите на вывод
SELECT r1.*,r2.*
FROM rentals r1
LEFT JOIN rentals AS r2
ON r1.item_id = r2.item_id
AND r1.last_change_date < r2.last_change_date
+---------+---------+------------------+---------+---------+------------------+
| item_id | user_id | last_change_date | item_id | user_id | last_change_date |
+---------+---------+------------------+---------+---------+------------------+
| 1 | 1 | 2009-01-01 | 1 | 3 | 2009-11-10 |
| 1 | 3 | 2009-11-10 | NULL | NULL | NULL |
| 3 | 3 | 2009-02-13 | 3 | 5 | 2010-05-11 |
| 3 | 5 | 2010-05-11 | NULL | NULL | NULL |
| 5 | 5 | 2010-06-04 | NULL | NULL | NULL |
| 7 | 7 | 2010-06-04 | NULL | NULL | NULL |
| 9 | 9 | 2010-06-04 | NULL | NULL | NULL |
+---------+---------+------------------+---------+---------+------------------+
Первые 3 столбца относятся к r1
столбцам, последние 3 относятся к r2
.
Как вы можете видеть, всякий раз, когда нет r2.last_change_date
, который больше r1.last_change_date
значение равно NULL.Это строки, где r1.last_change_date
является наибольшим.Таким образом, чтобы найти нужные строки, вы используете условие
WHERE r2.last_change_date IS NULL