Page 1 sur 1

Champs inconnu sur having

Posté : 20 mars 2005, 20:37
par ayayaaa
Bonjour,

je suis en train de faire un forum.
j'ai 2 tables : sujet et réponse.

Je veux afficher sur une page tous les sujets avec le nombre de réponse pour chaque sujet.
Sachant que je ne dois comptabiliser que les réponses acceptés par le modérateur.

Voilà ma requête :

Code : Tout sélectionner

$requete_message = "SELECT s.auteur AS auteur, s.titre AS titre, s.IDsujet AS IDsujet, count(*) AS nb_reponse "; $requete_message .= "FROM euralp_sujet s LEFT JOIN euralp_reponse r on (s.IDsujet=r.IDsujet) "; $requete_message .= "WHERE s.valide=1 "; $requete_message .= "GROUP BY s.IDsujet "; $requete_message .= "HAVING r.valide=1 "; $requete_message .= "ORDER BY s.date_maj DESC LIMIT $debut,$nb_enregistrement";
il y a un erreur sur le having. Il me dit que r.valide est un champs inconnu.
Quelqu'un aurait il une idée.

Merci par avance pour vos réponses

Ayayaaa

Posté : 21 mars 2005, 09:50
par sadeq
Moi aussi je te dirais la même erreur si j'étais MYSQL, regarde bien ta requête au niveau du where et du group by :
WHERE s.valide=1 ";
$requete_message .= "GROUP BY s.IDsujet ";
$requete_message .= "HAVING r.valide=1


Alors la question est : le champ valide se trouve où dans r (la table réponse) ou s (la table sujet) ???

Posté : 21 mars 2005, 13:35
par ayayaaa
Salut,

Merci pour la réponse.

En fait j'ai :
- un champs valide dans la table sujet pour savoir si le sujet a été validé par le modérateur
- et un champs valide dans la table reponse pour savoir si la réponse a été validé par le modérateur.

le where est la pour sélectionné les sujets validés et le having est là pour compter le nombre de réponse validé par sujet.
Mais peut être existe t'il une autre syntaxe pour calculer le nombre de réponse validé.

Quelqu'un aurait une autre idée

Merci par avance

Yannick

Posté : 21 mars 2005, 14:30
par sadeq
SELECT s.auteur AS auteur, s.titre AS titre, s.IDsujet AS IDsujet, count(*) AS nb_reponse
FROM euralp_sujet s INNER JOIN euralp_reponse r on (s.IDsujet=r.IDsujet)
WHERE s.valide=1
GROUP BY s.auteur , s.titre, s.IDsujet
HAVING r.valide=1
ORDER BY s.date_maj DESC
LIMIT $debut,$nb_enregistrement

Ta requête fait bien le comptage et t'as pas besoin d'autres méthodes.
Sauf qu'il faut utiliser un INNER JOIN (jointure naturelle = intersection)
et dans le GROUP BY il faut rappeler les champs du SELECT (dans l'ordre de tri vollu)

Ramarque les variables $debut et $nb_enregistrement doivent avoir des valeurs correctes avant l'exécution de la requête.

Posté : 21 mars 2005, 17:39
par ayayaaa
J'ai essayé ce que tu me dis sans plus de résultat.

Merci quand même

Ayayaaa

Posté : 21 mars 2005, 19:45
par ayayaaa
Ca y est j'ai trouvé une feinte.

Je sais pas si c'est ce qu'il y a de plus propre mais ca marche

voilà le résultat :

Code : Tout sélectionner

$requete_message = "SELECT s.auteur AS auteur, s.titre AS titre, s.IDsujet AS IDsujet, sum(r.valide) AS nb_reponse "; $requete_message .= "FROM euralp_sujet s LEFT JOIN euralp_reponse r on (s.IDsujet=r.IDsujet) "; $requete_message .= "WHERE s.valide=1 "; $requete_message .= "GROUP BY s.IDsujet, s.titre, s.auteur "; $requete_message .= "ORDER BY s.date_maj DESC LIMIT $debut,$nb_enregistrement";
Merci quand même

AYAYAAA