2016-11-10 11 views
1

Ich habe eine Tabelle:Wählen letzten Datensatz in jeder Gruppe

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 

ich letzten Datensatz in jeder Gruppe mit linked_group abrufen muß:

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

Wie dies zu tun? P.S. Ich brauche group_id = 2, zu ignorieren, weil diese group_id mit group_id Vereinigung braucht = 3

+0

Warum erscheint group_id 2 nicht in Ihrer Ergebnismenge? –

+0

linked_group = 3, muss Union mit group_id = 2 sein –

+0

wenn irgendein group_id Mitglied eine linked_group hat, die Gruppe ignorieren? –

Antwort

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

Versuchen Sie, diesen

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

muss ignoriert werden group_id = 2 –

0

Verwenden Sie die folgende Abfrage, wenn die Tabelle nicht zu groß ist.

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

Wird einen Fehler auslösen. Sie benötigen eine korrelierte Unterabfrage, genau wie in Mansoors Antwort. – jarlh

0

Hier ist ein weiterer Ansatz mit Zeilennummer Simulation. Beachten Sie die where not exists-Anweisung, um group_ids mit einer verknüpften Gruppe zu ignorieren.

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

Probieren Sie es aus. Hoffe, es wird funktionieren :)

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; 
Verwandte Themen