按加入查询的最新记录分组

时间:2019-03-28 12:22:24

标签: mysql join group-by

这是我的表deals_transaction_status_log,其中包含以下字段

id,user_id,deal_transaction_id,transaction_status_id,我要在其中获取分组为transaction_id且最近记录为on(最大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 个答案:

答案 0 :(得分:0)

使用相关子查询

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)