Мне нужно выбрать все столбцы в таблице для записей, которые соответствуют нескольким определенным параметрам

#mysql #max #mysql-5.6

Вопрос:

Я использую Navicat MySQL в качестве своего клиента с MySQL 5.6. Рассмотрим следующую воображаемую таблицу списков изменений пользователей, которую мы назовем [user_changelog].

идентификатор пользователя поле старое значение новое значение Дата Имя пользователя
2133 Адрес 101 Главная улица 202 Дуэт Лейн 2021-05-06 Пользователь1
2133 Город Таунсвилл Окраина города 2021-05-06 Пользователь1
2133 Государство Аль около 2021-05-06 Пользователь1
2133 застежка-молния 12334 90210 2021-05-06 Пользователь1
2133 Максимальное Количество Заказов 10 15 2021-05-06 Менеджер 1
1100 Государство Техас Мэриленд 2021-04-30 Пользователь1
1100 название компании ЛамеКо CoolCo 2021-04-30 Пользователь1
2133 Максимальное Количество Заказов нулевой 10 2021-04-25 Пользователь1
1100 Максимальное Количество Заказов нулевой 10 2021-04-14 Менеджер 2

Из этой таблицы мне нужно вернуть только строки для последнего изменения определенной точки данных для всех пользователей. Например, последнее изменение Максимального значения заказов для каждого уникального пользователя, отсортированное в порядке убывания по дате изменения.

Мой ожидаемый возвращаемый набор данных из таблицы [user_changelog] должен быть:

идентификатор пользователя поле старое значение новое значение Дата Имя пользователя
2133 Максимальное Количество Заказов 10 15 2021-05-06 Менеджер 1
1100 Максимальное Количество Заказов нулевой 10 2021-04-14 Менеджер 2

Этот запрос возвращает последние 500 изменений максимального значения заказов:

 SELECT
        cl.user_id
    ,   cl.field
    ,   cl.old_value
    ,   cl.new_value
    ,   cl.date
    ,   cl.username
                        
FROM user_changelog     AS  cl

WHERE cl.field = 'Max Orders'

ORDER BY cl.date DESC
LIMIT 500
 

…but if I try to limit the results by modifying cl.date to MAX(cl.date) in the SELECT statement, I of course get only a single row with the most recent date value, which I understand, but the other returned columns aren’t even from the same record.

I understand I need to use a sub-query here. But I’m struggling with that. I’ve tried this substitute WHERE clause for the above query, but it seems to run forever and never returns a result:

 WHERE cl.date = (SELECT MAX(d1.date) FROM user_changelog AS d1 WHERE d1.user_id = cl.user_id)
 

Я не уверен, где я ошибаюсь на данный момент. ТИА за любую помощь!

В/Р Пол