2010-08-10 3 views
2

Possible en double:
SQL Server: Only last entry in GROUP BYSQL: GROUP BY enregistrements, puis obtenir le dernier enregistrement de chaque groupe?

J'ai une table comme ceci:

id| name | attendence 
1 | Naveed| 1 
2 | Naveed| 1 
3 | Adil | 1 
4 | Adil | 1 

J'utilise requête suivante:

SELECT * FROM `test` WHERE `attendence`=1 GROUP BY name 

Le résultat avec requête ci-dessus:

id| name | attendence 
3 | Adil | 1 
1 | Naveed | 1 

Question:

lignes de groupe de résultat ci-dessus par nom, mais montrent la première rangée de chaque groupe. Je veux sélectionner la dernière rangée (par identifiant) de chaque groupe.

Par exemple:

id| name | attendence 
2 | Naveed | 1 
4 | Adil | 1 

Comment écrire requête pour résultat ci-dessus.

Merci

+0

N'a pas 'SELECT * FROM test WHERE attendence = 1 GROUP BY name' lancer une erreur ?? – egrunin

+0

@egrunin: En supposant que NAVEED utilise MySQL: http://dev.mysql.com/doc/refman/5.0/fr/group-by-hidden-columns.html –

+0

http://php.azerot.com/sql -group-by-get-last-record-from-each-group/ Voici le même problème pour la réponse de votre question – syraz37

Répondre

9
SELECT a.* 
FROM test a 
WHERE a.attendence = 1 
AND NOT EXISTS (select 1 from test where name = a.name and id > a.id and attendence = 1) 
GROUP BY name 

Pourraient même pas besoin du groupe en plus.

+0

Cela fonctionne.Merci. – NAVEED

0

Utilisez la requête suivante:

SELECT * FROM `test` WHERE `attendence`=1 GROUP BY name ORDER BY `id` DESC LIMIT 1 

Cela ne sélectionnera la ligne qui répond aux critères les plus élevés avec id.

+0

Il ne me donne qu'un seul enregistrement. Order By est appliqué après Group By ici. – NAVEED

+0

Oui, il ne vous donne qu'un seul enregistrement. C'est à ça que sert la LIMIT 1. Vous avez déclaré que vous vouliez seulement la dernière rangée. Cela ne vous donnera que la dernière ligne basée sur l'identifiant. Si vous voulez toujours toutes les lignes retournées, enlever l'expression 'LIMIT 1'. – Joseph

+0

Vous n'avez pas compris ma question. Je veux obtenir tous les groupes mais chaque groupe devrait être représenté par la dernière rangée de ce groupe. – NAVEED

4
SELECT MAX("id"), "name" FROM "test" WHERE "attendence" = 1 GROUP BY "name" 
1
SELECT Name, Max(ID) FROM table WHERE attendance = 1 GROUP BY Name