2010-01-22 9 views
6

Voici une version simplifiée de ma tableComment commander, groupe, commander avec mySQL

tbl_records 
-title 
-created 
-views 

Je me demande comment je peux faire une requête où ils sont regroupés par titre, mais le dossier qui est retourné pour chaque groupe est le dernier créé. Je vais ensuite l'ordonner par des vues.

Une façon dont je suppose est de faire une sous-requête et de l'ordonner par créé, puis de le grouper par titre, puis à partir de ces résultats, l'ordonner par des vues. Je suppose qu'il y a une meilleure façon cependant.

Merci

EDIT:

DONNÉES EXEMPLE:

-title: Gnu Design 
-created: 2009-11-11 14:47:18 
-views: 104 

-title: Gnu Design 
-created:2010-01-01 21:37:09 
-views:9 

-title: French Connection 
-created:2010-05-01 09:27:19 
-views:20 

Je voudrais que les résultats soient:

-title: French Connection 
-created:2010-05-01 09:27:19 
-views:20 

-title: Gnu Design 
-created:2010-01-01 21:37:09 
-views:9 

Seuls les plus récen t Gnu Design est affiché et les résultats sont classés par vues.

+1

Si vous avez des données d'échantillon, ce serait beaucoup plus clair. – Yada

+0

Oui, veuillez clarifier la question. –

Répondre

3

Voici un exemple du problème greatest-n-per-group qui apparaît fréquemment sur StackOverflow.

Voilà ma solution habituelle:

SELECT t1.* 
FROM tbl_records t1 
LEFT OUTER JOIN tbl_records t2 ON (t1.title = t2.title AND 
    (t1.created < t2.created OR t1.created = t2.created AND t1.primarykey < t2.primarykey)) 
WHERE t2.title IS NULL; 

Explication: trouver la ligne t1 pour lesquels aucune autre ligne t2 existe avec le même title et une plus grande date de created. En cas d'égalité, utilisez une clé unique pour résoudre l'égalité, sauf si vous avez plusieurs lignes par title.

1
select i.*, o.views from 
    (
     select 
     title 
     , max(created) as last_created 
     from tbl_records 
     group by title 
    ) i inner join tbl_records o 
    on i.title = o.title and i.last_created = o.created 
    order by o.views desc 

Je suppose que l'agrégation à appliquer à views est count(), mais pourrait bien être mal (vous aurez besoin d'avoir un moyen de définir quelle mesure de vues que vous souhaitez avoir le lastest créé Titre). J'espère que cela pourra aider.

EDIT: avoir vu vos données d'échantillon et modifié en conséquence.

0
SELECT title, 
     MAX(created), 
     views 
FROM table 
GROUP BY title 
ORDER BY views DESC