par
caroube » 01 mai 2008, 10:02
Le problème de SQL c'est qu'il ne peut sortir que ce qui existe. Donc si l'assocation X n'existe pas dans la ville Y (c'est-à-dire que l'enregistrement (X,Y) n'existe pas dans la table commune_asso), SQL ne va pas pouvoir l'inventer (c'est une conséquence du produit cartésien utilisé pour les jointures).
Ce que tu peux faire avec du SQL normal, c'est ça
Code : Tout sélectionner
SELECT count( a.idasso ) as cpte, a.nom, c.nom
FROM asso a, commune c, communeasso z
WHERE a.idasso = z.idasso
AND z.idcommune = c.idcommune
GROUP BY a.nom, c.nom
ça va te donner la liste des valeurs 1 de ton tableau, mais pas des valeurs 0
Pour avoir la liste de tous les couples associations/villes, il faut donc que tu supprimes la jointure et donc effectuer le produit cartésien de toutes les communes par toutes les associations sans te préoccuper de savoir si une association est dans une ville ou pas.
Code : Tout sélectionner
SELECT count( a.idasso ) as cpte, a.nom, c.nom
FROM asso a, commune c, communeasso z
GROUP BY a.nom, c.nom
Bien sûr, cela va donner un résultat aberrant dans les valeurs, mais au moins tu as tous les couples (associations/communes).
Peut-on avoir le beurre et l'argent du beurre ?
Oui. Dans certaines versions de bases de données, on peut ajouter des fonctions procédurales dans du code SQL. La syntaxe suivante marche dans MySQL 5 (peut-être avec la 4) et avec Oracle (syntaxe identique en enlevant le END).
Code : Tout sélectionner
SELECT count(CASE WHEN (a.idasso = z.idasso AND z.idcommune = c.idcommune)
THEN a.idasso
ELSE NULL
END) AS cpte, a.nom, c.nom
FROM asso a, commune c, communeasso z
GROUP BY a.nom, c.nom
La clause Where de la première requête a été déplacée dans le count ()
Tu récupères donc un tableau de toutes les associations/villes avec 1 si l'association existe et 0 si elle n'existe pas dans la ville. Après tu n'as plus qu'à lire ce résultat et en faire un tableau PHP.
Mais attention au temps de réponse : comme on a supprimé le WHERE, la base parcourt donc maintenant le nombre d'enregistrements de la table asso fois le nombre d'enregistrement de la table communeasso fois le nombre d'enregistrement de la table commune !
Le problème de SQL c'est qu'il ne peut sortir que ce qui existe. Donc si l'assocation X n'existe pas dans la ville Y (c'est-à-dire que l'enregistrement (X,Y) n'existe pas dans la table commune_asso), SQL ne va pas pouvoir l'inventer (c'est une conséquence du produit cartésien utilisé pour les jointures).
Ce que tu peux faire avec du SQL normal, c'est ça
[code]
SELECT count( a.idasso ) as cpte, a.nom, c.nom
FROM asso a, commune c, communeasso z
WHERE a.idasso = z.idasso
AND z.idcommune = c.idcommune
GROUP BY a.nom, c.nom
[/code]
ça va te donner la liste des valeurs 1 de ton tableau, mais pas des valeurs 0
Pour avoir la liste de tous les couples associations/villes, il faut donc que tu supprimes la jointure et donc effectuer le produit cartésien de toutes les communes par toutes les associations sans te préoccuper de savoir si une association est dans une ville ou pas.
[code]
SELECT count( a.idasso ) as cpte, a.nom, c.nom
FROM asso a, commune c, communeasso z
GROUP BY a.nom, c.nom
[/code]
Bien sûr, cela va donner un résultat aberrant dans les valeurs, mais au moins tu as tous les couples (associations/communes).
Peut-on avoir le beurre et l'argent du beurre ?
Oui. Dans certaines versions de bases de données, on peut ajouter des fonctions procédurales dans du code SQL. La syntaxe suivante marche dans MySQL 5 (peut-être avec la 4) et avec Oracle (syntaxe identique en enlevant le END).
[code]
SELECT count(CASE WHEN (a.idasso = z.idasso AND z.idcommune = c.idcommune)
THEN a.idasso
ELSE NULL
END) AS cpte, a.nom, c.nom
FROM asso a, commune c, communeasso z
GROUP BY a.nom, c.nom
[/code]
La clause Where de la première requête a été déplacée dans le count ()
Tu récupères donc un tableau de toutes les associations/villes avec 1 si l'association existe et 0 si elle n'existe pas dans la ville. Après tu n'as plus qu'à lire ce résultat et en faire un tableau PHP.
Mais attention au temps de réponse : comme on a supprimé le WHERE, la base parcourt donc maintenant le nombre d'enregistrements de la table asso fois le nombre d'enregistrement de la table communeasso fois le nombre d'enregistrement de la table commune !