Другим способом решения этой проблемы может быть LEFT JOIN
, который может быть более эффективным. Сначала я начну с примера, который рассматривает только поле даты, поскольку, вероятно, более распространено хранить дату + время в одном столбце даты и времени, и я также хочу сделать запрос простым, чтобы его было легче понять.
Итак, в этом конкретном примере, если вы хотите показать самую старую запись, основанную на столбце date , и предполагая, что имя вашей таблицы называется people
, вы можете использовать следующий запрос:
SELECT p.* FROM people p
LEFT JOIN people p2 ON p.name = p2.name AND p.date > p2.date
WHERE p2.date is NULL
GROUP BY p.name
Что делает LEFT JOIN
, так это когда столбец p.date
имеет минимальное значение, в левом соединении не будет p2.date
с меньшим значением, и поэтому соответствующий p2.date
будет NULL
, Таким образом, добавляя WHERE p2.date is NULL
, мы показываем только записи с самой старой датой.
И точно так же, если вы хотите вместо этого показать новейшую запись , вы можете просто изменить оператор сравнения в LEFT JOIN
:
SELECT p.* FROM people p
LEFT JOIN people p2 ON p.name = p2.name AND p.date < p2.date
WHERE p2.date is NULL
GROUP BY p.name
Теперь, для этого конкретного примера, где дата + время являются отдельными столбцами, вам нужно будет каким-то образом добавить их, если вы хотите выполнить запрос на основе даты-времени двух столбцов, например:
SELECT p.* FROM people p
LEFT JOIN people p2 ON p.name = p2.name AND p.date + INTERVAL TIME_TO_SEC(p.time) SECOND > p2.date + INTERVAL TIME_TO_SEC(p2.time) SECOND
WHERE p2.date is NULL
GROUP BY p.name
Подробнее об этом (а также о некоторых других способах достижения этой цели) можно прочитать на строках, содержащих групповой максимум определенного столбца .