2009-09-22 7 views
0

J'ai une table MySQL semblable à ceci:MySQL: aller chercher des lignes distinctes par année

| id | name | create_date | 
--------------------------- 
| 1 | foo | 2003-03-11 | 
| 2 | goo | 2003-04-27 | 
| 3 | woo | 2004-10-07 | 
| 4 | too | 2004-12-01 | 
| 5 | hoo | 2005-04-20 | 
| 6 | koo | 2006-01-12 | 
| 7 | boo | 2006-04-17 | 
| 8 | moo | 2006-08-19 | 

Je veux aller chercher toutes les dernières lignes annuelles - une fois par an. Donc, dans l'exemple ci-dessus, je vais obtenir 2, 4, 5 et 8.

Quelle est la bonne syntaxe?

Répondre

1

vous pouvez faire quelque chose comme

select * from nom_table où create_date dans ( select max (create_date) du groupe nom_table par année (create_date))

0
SELECT id FROM foo JOIN 
    (SELECT YEAR(create_date),MAX(create_date) AS md 
    FROM foo 
    GROUP BY YEAR(create_date)) as maxes 
ON (create_date=md); 

Si vous mettez un index sur create_date, ce sera assez rapide.

0
SELECT mi.* 
FROM (
     SELECT DISTINCT YEAR(created_date) AS dyear 
     FROM mytable 
     ) md 
JOIN mytable mi 
ON  mi.id = 
     (
     SELECT id 
     FROM mytable ml 
     WHERE ml.create_date < CAST(CONCAT_WS('.', dyear + 1, 1, 1)) AS DATETIME) 
     ORDER BY 
       ml.create_date DESC 
     LIMIT 1 
     ) 
2

Certains des autres réponses peuvent travailler pour vous, mais cette simple requête ne nécessite pas de joint

SELECT YEAR(create_date), 
(SELECT id ORDER BY create_date DESC LIMIT 1) 
FROM mytable 
group by YEAR(create_date) 
0
select id 
from mytable 
where not exists (
    select * from mytable as T2 
    where T2.id = mytable.id 
    and T2.id >= year(created_date) + 1 
) 
Questions connexes