#mysql #join #group-by
#mysql #Присоединиться #группировать по
Вопрос:
Вот моя таблица deals_transaction_status_log
со следующими полями
id, user_id, deal_transaction_id, transaction_status_id, в котором я хочу извлекать записи с включенной группой по transaction_id
с включенной последней записью (максимум id
).
Эта таблица также объединяет некоторые другие таблицы, чтобы получить некоторые другие данные.
Вот мой запрос
SELECT dtsl.id ,dtsl.deal_transaction_id,dts.id as statusId
FROM deals_transaction_status_log as dtsl
JOIN deals_transactions as dt ON dt.id=dtsl.deal_transaction_id AND dt.visitor_id=140
JOIN DEALS as d ON d.idDeal=dt.deal_id
JOIN USER as u ON d.userId=u.idUser
JOIN deals_transaction_status as dts ON dts.id=dtsl.transaction_status_id
WHERE dtsl.user_id!=140 AND dtsl.transaction_status_id=14 AND dtsl.id IN (
SELECT MAX(dtsl.id)
FROM deals_transaction_status_log as dtsl
GROUP BY dtsl.deal_transaction_id
) GROUP BY dtsl.deal_transaction_id
Это работает нормально, однако возвращает только одну запись, даже если у меня есть более одной записи с одинаковыми deal_transaction_id
например:
Пример ввода
id user_id deal_transaction_id transaction_status_id
1 4 2 14
2 4 2 14
3 5 3 14
4 5 3 14
Результат
id statusId deal_transaction_id
3 14 3
Ожидаемый результат
id statusId deal_transaction_id
2 14 2
4 14 3
Обновить
Я только что попробовал fa06 ответить без какого-либо объединения
SELECT dtsl.id,dtsl.deal_transaction_id,dtsl.transaction_status_id FROM deals_transaction_status_log as dtsl
WHERE dtsl.id IN (
SELECT MAX(id)
FROM deals_transaction_status_log as b where dtsl.transaction_status_id=b.transaction_status_id)
AND dtsl.transaction_status_id=14
GROUP BY dtsl.deal_transaction_id
Но все равно я получаю только одну строку
Комментарии:
1. Группировать по без каких-либо агрегатных функций вряд ли будет полезно
2. @P.Salmon я тебя не понял
3. Чувства взаимны, ваш запрос использует 5 таблиц, и вы предоставили образец ввода для 1. можете ли вы либо предоставить образцы данных для всех таблиц, либо сократить свой запрос, чтобы использовать только предоставленные вами образцы данных.
Ответ №1:
использовать коррелированный подзапрос
SELECT dtsl.id ,dtsl.deal_transaction_id,dts.id as statusId
FROM deals_transaction_status_log as dtsl
JOIN deals_transactions as dt ON dt.id=dtsl.deal_transaction_id AND dt.visitor_id=140
JOIN DEALS as d ON d.idDeal=dt.deal_id
JOIN USER as u ON d.userId=u.idUser
JOIN deals_transaction_status as dts ON dts.id=dtsl.transaction_status_id
WHERE dtsl.user_id!=140 AND dtsl.transaction_status_id=14 AND dtsl.id IN (
SELECT MAX(id)
FROM deals_transaction_status_log as b where dtsl.deal_transaction_id=b.deal_transaction_id)
Комментарии:
1. Я получаю синтаксическую ошибку
your MySQL server version for the right syntax to use near 'b where dtsl.transaction_status_id=b.transaction_status_id ) GROUP ' at line 11
2. Теперь я получаю две строки, но
id
s для каждой строки являются первыми, а не последнимиid
3. теперь он возвращает только одну строку, как я описал в своем вопросе: (
4. MySQL версии 5.7.25