【问题标题】:Group by with latest record on join query与最新的连接查询记录分组
【发布时间】:2019-03-28 12:22:24
【问题描述】:

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

id,user_id,deal_transaction_id,transaction_status_id 我想在其中获取transaction_id 上的group by 记录,最新记录为(最大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

但我仍然只得到一行

【问题讨论】:

  • 没有任何聚合函数的 group by 不太可能有用
  • @P.Salmon 我没听懂你
  • 相互的感觉,您的查询使用 5 个表,并且您为 1 个表提供了示例输入,您可以为所有表提供示例数据还是减少查询以仅使用您提供的示例数据。

标签: mysql join group-by


【解决方案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)

【讨论】:

  • 我收到语法错误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
  • 现在我得到了两行,但每行的ids 是第一行,而不是最新的id
  • 现在它只返回一行,正如我在我的问题中描述的那样:(
  • MySql Ver 5.7.25
猜你喜欢
  • 2013-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 2018-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多