Jointure Sql Count(*)

Par DylanVsn, il y a 10 ans


Base de données MySQL

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 :

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

shinix, il y a 10 ans

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, il y a 10 ans

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 :/

DylanVsn, il y a 10 ans

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, il y a 10 ans

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..

DylanVsn, il y a 10 ans

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

gseverin, il y a 10 ans

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