2009-08-06 8 views
0

Salut, je suis nouveau à SQL et j'essaie de comprendre comment je vais obtenir le top 5 "bandes" avec la plupart des amis (userId) et c'est ce que j'ai; un usertbl avec userId comme PK puis un bandsTbl avec bandId comme PK alors j'ai une table bandfriends avec FK userId et bandId.Top 5 avec le plus d'amis

bandfriends 
userid | bandId 
--------------- 
1  | 1 
1  | 2 
1  | 3 

Merci!

Répondre

0

Lire sur COUNT et GROUP BY à mysql.org

Vous voulez quelque chose comme ça (je ne l'ai pas testé):

SELECT bandId, COUNT(*) as fans FROM bandfriends 
ORDER BY fans DESC 
GROUP BY bandId 
LIMIT 5; 
+0

Aussi, sélectionnez top 5 Bandid – Secko

+1

SQL Server ne prend pas en charge LIMIT. Cette réponse semble juste pour MySQL. –

+0

Merci, cela m'a vraiment aidé à résoudre mon problème. –

5
SELECT TOP 5 bandId, fanCount 
FROM 
    (SELECT bandId, COUNT(*) as fanCount 
    FROM bandfriends 
    GROUP BY bandId 
    ORDER BY COUNT(*) DESC) 

Vous pouvez également spécifier en option WITH TIES dans l'instruction select. Voir this et this.

+0

+1 pour m'éclairer à "avec des cravates". J'ai honte de ne pas le savoir déjà. – Dusty

+0

Je pense que vous ne pouvez pas utiliser une commande dans un sous-select. Cela va à l'encontre du modèle relationnel. Vous devriez le déplacer vers le select externe. – neves

+0

@neves: Je ne comprends pas votre commentaire. La liste doit être commandée avant que vous puissiez sélectionner le top 5, l'ordre doit être fait dans une sous-requête car elle nécessite un agrégat. En outre, il n'est pas possible de rompre le modèle relationnel avec un select. Combattez-le, oui, mais ne le cassez pas. :-) –

2
select top 5 b.b_name, count(friends) as numOfFriends 
from bands b inner join link l on b.b_id = l.bands inner join 
friends f on f.f_id = l.friends 
group by b.b_name 
order by numOfFriends desc 

Si vous avez la table d'amis, table bandes et une table de lien, fonctionne pour moi :)

Questions connexes