检索组中的最新记录

时间:2013-11-26 07:35:29

标签: mysql

我要做的就是这个......

我有一个记录记录状态变化的数据库......

例如,它可能被设置为“非活动”,然后,后一行可能会重新激活记录...

1 Company1 Active
2 Company2 Active
3 Company1 Inactive
4 Company1 Active

查询需要查找当前有效的结果...并且应该返回两个记录...(一个用于Company1,一个用于Company2。)

我只需要返回当前有效的记录。

此查询包含部分内容......

SELECT id, gid, status
FROM companies
GROUP BY gid
HAVING status = 'Active'
ORDER BY id

但它不会根据最后一条记录查找返回的结果......

我基本上看的是如何在每个组中加入一些只检查最新记录的内容,如“LIMIT 1,1”和“ORDER BY id DESC”...我不知道如何合并它进入查询。

更新到目前为止,我已经了解到这一点......根据答案,但它会带回每个群组的最后一行,无论它目前是否有效......

select t.* 
from (
   select status, max(id) as id
   from companies 
   group by gid
   having status = 'Active'
) active_companies
inner join companies t on active_companies.id = t.id

4 个答案:

答案 0 :(得分:2)

如果您的ID始终按升序排列,则会为每家公司选择最新的ID:

SELECT MAX(id), gid
FROM companies
GROUP BY gid

这将返回您需要的所有记录:

SELECT companies.*
FROM companies INNER JOIN (SELECT MAX(id) m_id
                           FROM companies
                           GROUP BY gid) m
     ON companies.id = m.m_id
WHERE
  status = 'Active'

您可能也想尝试使用这个小技巧:

SELECT *
FROM (SELECT * FROM companies ORDER BY id DESC) t
GROUP BY gid
HAVING status='Active';

但请不要!它通常/最常用,它看起来更干净,而且通常更快,但依赖于未记录的行为,因此无法保证您始终能获得正确的结果。

请参阅小提琴here

答案 1 :(得分:2)

以下查询使用MySQL技巧返回每个公司的当前状态:

select gid, substring_index(group_concat(status order by id desc), ',', 1) as status
from companies
group by gid;

如果您只想要当前有效的那些:

select gid
from companies
group by gid
having 'active' = substring_index(group_concat(status order by id desc), ',', 1)

答案 2 :(得分:1)

让我们将问题分成两个较小的问题:

首先,您希望从每个组中获取最新条目:

select max(id) 
from companies 
group by gid;

接下来,您希望只有条目(最后一个条目)和哪些条目处于活动状态:

select t.* 
from companies t
inner join (
  select max(id) as id
  from companies 
  group by gid
) last_entries
on t.id = last_entries.id
where t.status = 'Active';

答案 3 :(得分:0)

尝试一个subselect获取记录,其中status ='Active'并按id排序(我假设是自动递增)desc然后在父选择do group by

SELECT t.* FROM (
SELECT * 
FROM companies
WHERE `status` = 'Active'
ORDER BY id DESC
) t
GROUP BY t.gid