2016-11-10 73 views
1

在最后一个记录我有一个表:选择每个组

id group_id name linked_group 
1  1   Name1 
2  1   Name2 
3  1   Name3 
4  1   Name4 
5  2   Name5 
6  2   Name6 3 
7  2   Name7 
8  3   Name8 
9  3   Name9 
10 4   Name10 
11 4   Name11 

我需要每组linked_group中检索最后一条记录:

id group_id name linked_group 
4  1   Name4 
9  3   Name9 
11 4   Name11 

如何做到这一点? P.S.我需要忽略GROUP_ID = 2,因为这需要GROUP_ID工会与GROUP_ID = 3

+0

为什么group_id 2没有出现在你的结果集中? –

+0

linked_group = 3,需要与group_id = 2联合 –

+0

如果有任何group_id成员有链接组忽略该组? –

回答

0
SELECT Your_tableName.id ,Your_tableName.group_id ,name,linked_group 
FROM Your_tableName 
    JOIN (SELECT MAX(id) id, group_id 
      FROM Your_tableName 
      GROUP BY group_id) A ON A.id = Your_tableName.id 
0

试试这个

SELECT g.id,g.group_id,g.name,g.linked_group 
FROM GroupTable g LEFT JOIN GroupTable g2 
ON (g.group_id = g2.group_id AND g.id < g2.id) 
WHERE g2.id IS NULL; 

enter image description here

+0

需要忽略group_id = 2 –

0

下面的查询使用,如果表是不是太大。

select max_id, group_id, name from table_name , (select max(id) as max_id from table_name group by group_id) tmp where id = max_id ; 
+0

会引发错误。你需要一个相关的子查询,就像在Mansoor的答案中一样。 – jarlh

0

这里是另一种使用行号模拟的方法。注意where not exists语句忽略带链接组的group_ids。

select s.id,s.group_id,s.name,s.linked_group 
from 
(
select t.*, 
      if(t.group_id <> @p , @rownumber:=1,@rownumber:[email protected] + 1) rownumber, 
      @p:=t.group_id 
from t t, (select @rownumber:=0,@p:=0) rn 
where not exists (select * from t t1 where t1.group_id = t.group_id and t1.linked_group is not null) 
order by t.group_id,t.id desc 
) s 
where s.rownumber = 1 
0

试试看。希望它能工作:)

SELECT a.* 
FROM table_name a LEFT JOIN table_name b 
ON (a.group_id = b.group_id AND a.id < b.id) 
WHERE a.group_id <> 2 AND b.id IS NULL;