Aggrégation par clé étrangère

a marqué ce sujet comme résolu.

Bonjour !

Je reviens vers vous car j’aimerais régler un problème en SQL et je n’y arrive pas pour le moment.

Pour faire simple, j’ai trois objets :

class Faction(models.Model):
  name = name = models.CharField(max_length=255)
  
  
class ArmyList(models.Model):
  faction = models.ForeignKey(Faction, on_delete=models.CASCADE)


class Subscription(models.Model):
   army_list = models.ForeignKey(
        ArmyList, on_delete=models.SET_NULL, null=True, blank=True
    )

(Bien sûr je ne vous mets que les lignes pertinentes). Pour résumer le code ci-dessus : une inscription possède une liste d’armée, qui elle-même est rattachée à une faction qui possède un nom.

Dans ma vue, je récupère l’ensemble des Subscription qui m’intéressent.

Ce que je voudrais : compter combien j’ai de Subscription pour chaque Faction, donc quelque chose qui ressemble à un dictionnaire {"faction1": 14}.

Actuellement, je le fais dans le code python :

factions_count = defaultdict(lambda: 0)

for subscription in subscriptions:
    factions_count[subscription.army_list.faction.name] += 1

Bien sûr ça fonctionne, mais je me demande si avec du SQL, il y aurait possibilité d’optimiser cela, mais je ne trouve pas du tout.

Avez-vous des idées ?

Je vais prendre une exemple simple, avec des structures très classiques :

  • une table départements, avec les 95 départements et 2 infos : CDEPT n° de dept, et LDEPT nom du dépt
  • une table villes avec les 36000 communes, et 2 infos : CDEPT et LCOMM, nom de la commune.
Select D.LDEPT, count(*) as NB_communes 
from departement D
     inner join VILLES V on V.CDEPT = D.CDEPT
group by D.LDEPT
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte