gihefca
Messages postés3Date d'inscriptionsamedi 28 mai 2005StatutMembreDernière intervention 7 juillet 2008
-
6 juil. 2008 à 15:05
neigedhiver
Messages postés2480Date d'inscriptionjeudi 30 novembre 2006StatutMembreDernière intervention14 janvier 2011
-
9 juil. 2008 à 10:18
Salut :)
J'ai un problème avec une jonction
Voilà, j'ai 2 tables, une table news (id, news, date et valide) et une table commentaire (id, idnews, commentaire)
Je souhaite afficher les news avec le nombre de commentaires par news (0 s'il n'y en a pas)
En gros, la requête donne :
select n.id, n.news, n.date, n.valide, count(c.id)
from news n, commentaire c
where (n.id=c.idnews or n.id<>c.idnews) and n.valide=1
group by n.id order by n.date
Le problème, c'est que le count(c.id) affiche le nombre total de commentaire, mais pas le nombre de commentaire par news
C'est surement faisable, mais je vois pas comment
Et comme on dit, il vaut mieux 1 qui sait que 10 qui cherchent
neigedhiver
Messages postés2480Date d'inscriptionjeudi 30 novembre 2006StatutMembreDernière intervention14 janvier 201119 7 juil. 2008 à 17:05
Salut,
Ta clause where me semble bizarre :
where (n.id=c.idnews or n.id<>c.idnews)
Là, tu cherches toutes les news, quel que soit leur id...
Peut-être que :
where n.id=c.idnews
seulement, ce serait mieux... Non ? Ca, c'est une jointure gauche implicite.
Sauf que... Effectivement, MySQL ne sera pas capable de ne compter que les commentaire pour chaque news, s'il doit toutes les récupérer.
Il faudra alors faire une requête par news, pour compter le nombre de commentaires.
Une autre méthode consiste à stocker dans un champ de chaque news le nombre de commentaires qu'elle a reçus.
Il faut mettre à jour ce champ à chaque fois qu'un commentaire est posté, et à chaque fois qu'un commentaire est supprimé.
Si tu contrôles parfaitement ce compteur, il sera toujours juste et tu le récupèreras dans la requête avec l'id de la news, son contenu, etc, et ce, sans frais supplémentaire (performances).
Tu peux aussi le recalculer de temps en temps pour chaque news, pour t'assurer qu'il est correct (en faisant une requête de type SELECT COUNT pour chaque news, et en modifiant sa valeur si besoin).
D'un point de vue purement théorique, cette approche n'est pas très conforme ; mais du point de vue du développeur, elle est très économe en traitements (et largement utilisée : c'est une sorte de mise en cache).
<hr size="2" width="100%" />Neige
N'hésitez pas à lire la doc de PHP avant de poser des questions triviales...
gihefca
Messages postés3Date d'inscriptionsamedi 28 mai 2005StatutMembreDernière intervention 7 juillet 2008 7 juil. 2008 à 20:13
Faire 2 requêtes, une avec toutes les news et l'autre avec le nombre total de commentaire pour chaques news, c'est la première idée que j'ai eu
Je me demandais juste si ce n'était pas faisable en une seule requête
Le problème du champs total dans la table news, c'est qu'à chaque opération sur la table commentaire, il va falloir 2 requêtes, une pour l'insert/delete du commentaire et une pour la mise à jour du champs total dans la table news
neigedhiver
Messages postés2480Date d'inscriptionjeudi 30 novembre 2006StatutMembreDernière intervention14 janvier 201119 9 juil. 2008 à 10:18
Le problème, sinon, c'est que tu vas avoir une requête pour récupérer les news, et une requête par news pour compter le nombre de commentaires...
Je te laisse réfléchir à la situation qui se produit le plus souvent :
- afficher la liste des news avec le nombre de commentaires sur chaque (n+1 requêtes)
- insérer un commentaire (2 requêtes)
Pour moi, y'a pas photo...
<hr size="2" width="100%" />Neige
N'hésitez pas à lire la doc de PHP avant de poser des questions triviales...