根据连接表中的最新行选择MySQL结果

时间:2014-07-30 21:46:43

标签: mysql sql join

我正在使用我们用于帐户管理的供应商的第三方数据库。我们需要以编程方式运行的查询之一是查看哪些帐户当前处于活动状态。没有单列 - 状态在主信息表的单独表格中跟踪,该表跟踪状态的所有变化,从激活到删除。

我想做一个这样的简单连接:

SELECT  u.id ,
        s.status
FROM    user_table u
        JOIN status_table s ON u.id = s._id
WHERE   s.acct_status = "ACTIVE"
        OR s.new_status = "ACTIVE";

但是这不起作用,因为可能有一个后来的记录将帐户状态设置为TERMINATED或其他。注意:每个帐户都有一种或另一种状态条目。

出于这个问题的目的,用户表是什么样的并不重要。状态表非常简单:

_id
date_entered
acct_status
new_status

我很确定这个查询会让我获得最新的状态更新(感谢this post,但我不确定如何在这里加入:

select 
    *
from
    (select 
        _id, new_status
    from
        aria.get_acct_status_history
    order by date_entered desc) as t1
group by _id;

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

如果您需要状态表中每个用户的最新记录,那么您可以通过获取每个用户条目的最大日期来使用数据列上的自联接,并假设_id表中的status_table表示用户ID

SELECT s.* FROM status_table s
JOIN (
  SELECT _id ,MAX(date_entered) date_entered 
  FROM status_table 
  GROUP BY _id 
) s1
ON(s._id = s1._id  AND s.date_entered = s1.date_entered )
WHERE s.acct_status = "ACTIVE" or s.new_status = "ACTIVE";

稍后您将加入users表以获取用户信息,加入最大日期列即ie。 AND s.date_entered = s1.date_entered将满足您的条件,即每个用户条目的最近行数

SELECT u.id, s.status 
FROM user_table u 
JOIN status_table s ON u.id = s._id
JOIN (
  SELECT _id ,MAX(date_entered) date_entered 
  FROM status_table 
  GROUP BY _id 
) s1
ON(s._id = s1._id  AND s.date_entered = s1.date_entered )
WHERE s.acct_status = "ACTIVE" or s.new_status = "ACTIVE";