Bonjour a tous,

Je viens vers vous aujourd'hui pour un petit soucis de jointure.

Je vous explique ; je crée un forum et pour chaque catégorie je voudrais récupérer le nombre de Sujets.

Dans la table forum_categories j'ai un champ id et dans la table forum_sujets j'ai un champ categorie_id .

J'ai essayais plusieurs code mais le dernier est :

$requete = $pdo->query("SELECT forum_categories.*, count(forum_sujets.id)  FROM forum_categories, forum_sujets 
            WHERE forum_categories.id = forum_sujets.categorie_id");
$requete->execute();

foreach ($requete as $categorie){
    var_dump($categorie);
}

Mais le résultat est le suivant :

array (size=8)
  'id' => string '1' (length=1)
  0 => string '1' (length=1)
  'name' => string 'Jeux' (length=4)
  1 => string 'Jeux' (length=4)
  'description' => string 'Du jeux de ouf' (length=14)
  2 => string 'Du jeux de ouf' (length=14)
  'count(forum_sujets.id)' => string '3' (length=1)
  3 => string '3' (length=1)

A la ligne 'count(forum_sujets.id)' => string '3' Il me récupére 3 alors que je n'est que deux sujets liés a cette catégorie.

Pour étre simple ce que je voudrais est :

  • Nom de la catégorie.
  • Description de la catégorie.
  • Nombre de sujets.

Mais tous ca avec une seul requete Sql ?

Merci a tous d'avance et bonne fin de journée.

NydalSinvio

(Ps : J'ai regardé sur le forum mais aucun des codes trouvés ne fonctionne).

7 réponses


DylanVsn
Auteur
Réponse acceptée

J'ai réussi :p
Voila le code utilisé :

// Récupération de toutes les catégories.
        function read_categories($pdo){
            $requete = $pdo->query("SELECT * FROM forum_categories ORDER BY id");
            $requete->execute();
            foreach ($categories as $categorie){
                echo "<p>".$categorie['name']."</p> <span>".$categorie['description']."</span>";
                echo count_sujets($pdo,$categorie['id']);
            }
            return $requete;
        }

        // du nombre de sujet par catégorie.
        function count_sujets($pdo,$id){
            $requete = $pdo->query("SELECT * FROM forum_sujets WHERE categorie_id = '$id'");
            $requete->execute();
            $count = $requete->rowCount();

            return $count;
        }

En tous cas un grand merci de ton aide ! Bon fin de journée

Salut,
Le mieux pour la création d'un forum c'est d'ajouter un champs dans ta table "nb_topics" et "nb_messages" que tu incrémentes a chaque ajout ou suppression de topic/message.

DylanVsn
Auteur

Donc dans la table Categorie j'ajoute un champ nb_sujets et dans la table sujets j'ajoute un champ nb_posts que je change a chaque nouveau ajout / suppretion ? Mais ca va ne va rien changé pour la récupération du dernier message :/

Exacte, pour la récupération du dernier message tu as juste à rajouter un champs "last_message_id" :)

Un exemple de tables sql pour un forum : http://openclassrooms.com/courses/creer-son-forum-de-toutes-pieces/avant-tout-2#/id/r-1401481

DylanVsn
Auteur

C'est une bonne idée mais mes catégorie sont lister de la sorte :

$requete = $pdo->query("SELECT * FROM forum_categories ORDER BY id");
$requete->execute();

foreach ($categories as $categorie){ 
    echo "<p>".$categorie['name']."</p> <span>".$categorie['description']."</span>";
} 

Comment faire pour récupérer le dernier sujet de chaque catégorie .. C'est vite compliqué avec le Sql :p

DylanVsn
Auteur

Merci de ton lien mais les cours de OpenClassRoom c'est un vrai bordel est la a part faire une requete de la taille d'une page entiére et des while par ci par la je ne trouve pas la solution..

Pour recuperer le dernier sujet :
Tu fais un max() sur ta cle primaire

GENRE :

SELECT max(id) FROM forum_sujets WHERE categorie_id = '$id'

si tu rajoutes des champs il faut que tu groupes

SELECT max(id),titre FROM forum_sujets WHERE categorie_id = '$id'
group by titre