2008-11-17 7 views
0

J'ai deux tables: articles et articletagsrequête SQL pour obtenir le plus grand jour distincte - genre de

articles: id, author, date_time, article_text 
articletags: id, tag 

(article.id == articletags.id in a many-to-many relationship) 

Je suis après la dernière fois que quelque chose a été publié sous chaque balise. Pour le dire autrement, pour chaque tag, parcourez tous les articles auxquels il est lié et trouvez le plus récent et retournez-le.

par exemple articles:

1, me, 12 Nov, Sometext 
2, me, 13 Nov, Sometext 
3, me, 14 Nov, Sometext 

balises article

1, foo 
1, bar 
2, foo 
3, bar 

Je veux revenir:

foo, 13 Nov 
bar, 14 Nov 

je peux obtenir jusqu'à une jointure interne puis stumped . Je ne pense pas qu'une clause DISTINCT est ce que je suis après et je ne suis pas assez familier pour les sous-requêtes pour savoir si cela aiderait.

SELECT date_time, tag 
FROM articles, articletags 
WHERE articles.id = articletags.id 

Est-ce encore possible?

Répondre

4
select t.tag, max(a.date_time) as latest 
from articles a 
inner join articletags t 
on t.id = a.id 
group by t.tag 
0
SELECT date_time, tag 
FROM articles, articletags 
WHERE articles.id = articletags.id 
ORDER BY date_time DESC 
GROUP BY tag 
+0

Cela finit réellement retourner le plus ancien, pas la plus récente. C'est le comportement par défaut qui apparaît, donc il faut une clause max comme la solution de Gorden Bell. Deuxièmement, si vous utilisez MySQL, vous devez inverser Order By et Group by around pour que cela fonctionne. Je ne sais pas pourquoi mais tu fais. – Hyposaurus

+0

@Hyposaurus: la norme SQL dit GROUP BY vient avant ORDER BY. –

+0

@SoapBox: le problème avec ceci est qu'il retourne toutes les lignes, pas seulement la ligne de date maximum, pour chaque étiquette. –

Questions connexes