2017-10-18 14 views
-2

J'ai ce tableauMySQL Query, je veux sélectionner la rangée la plus réelle pour chaque personne

id|name|number|date 
1|peter|2|2017-09-18 
2|peter|1|2017-10-03 
3|james|4|2017-09-05 
4|james|1|2017-10-10 
5|james|0|2017-10-15 
6|kate|4|2017-09-16 
7|kate|2|2017-10-17 

Je veux sélectionner la ligne la plus réelle pour chaque personne (la ligne avec la dernière date). Le résultat ressemblera à

2|peter|1|2017-10-03 
5|james|0|2017-10-15 
7|kate|2|2017-10-17 

Quelle requête MYSQL peut faire cela?

Quelque chose comme:

SELECT id, name, number, date 
FROM table 
GROUP BY id, name, number, date 
HAVING date the latest 
+0

Qu'est-ce qui se qualifie comme "* la ligne la plus réelle *" pour chaque personne? –

+0

Voulez-vous dire la dernière date? –

+0

Oui, je veux dire la dernière date. Je suis désolé pour mon anglais. –

Répondre

0
select t1.* from table t1, (select t2.name name2, max(t2.date) 
date2 from table t2 group by t2.name) t3 where t1.name = t3.name2 and t1.date = t3.date2 
+0

Il dit "Sous-requête renvoie plus de 1 rang" erreur :( –

+1

S'il vous plaît ajouter une courte explication – Moes

+0

Ok, s'il vous plaît Essayez la réponse éditée –

0

SELECT * FROM persons WHERE name='someone' order by date desc limit 1

Cela fonctionne bien pour sélectionner l'entité par lastest nom spécifié.

SELECT * FROM persons GROUP BY name, date ORDER BY date DESC

je l'ai écrit avec mon mobile, quelque chose peut-être tort, mais ses concepts seront corrects.

0
MariaDB [test]> select * from stack s1 where s1.d = (select max(s2.d) 
from stack s2 where s2.name = s1.name); 
+------+-------+------+------------+ 
| id | name | num | d   | 
+------+-------+------+------------+ 
| 2 | peter | 1 | 2017-10-03 | 
| 5 | james | 0 | 2017-10-15 | 
| 7 | kate | 2 | 2017-10-17 | 
+------+-------+------+------------+ 
3 rows in set (0.00 sec) 

Et pour les grands ensembles de données, n'oubliez pas d'ajouter des index aux colonnes 'name' et 'd'.