Doublons en résultat lors d'une jointure

Par TheMancunien, il y a 10 ans


Base de données MySQL

Bonjour,
J'ai un problème dans le résultat lors de l'exécution de ma requête SQL.

Mes tables

Mon code

<?php $selectArticle = $db->prepare('SELECT articles.titre_article AS titre, categories.nom_categorie AS categorie FROM articles INNER JOIN jonction ON articles.id_article = jonction.id_article INNER JOIN categories ON categories.id_categorie = jonction.id_categorie'); $selectArticle->execute() or die(print_r($selectArticle->errorInfo())); $articles = $selectArticle->fetchAll(PDO::FETCH_OBJ); ?> <?php foreach ($articles as $article): ?> <h3> <a href="#"><?php echo $article->titre; ?> <span class="badge"><?php echo $article->categorie; ?></span> </a> </h3> <hr> <?php endforeach ?>

Résultat que j'obtiens

Résultat que je veux

et merci d'avance

4 réponses

Huggy, il y a 10 ans

Bonsoir TheMancunien,

Tu as plusieurs solutions : la première c'est de garder ta requête telle-quelle mais de gérer les ruptures de catégories dans la boucle foreach.
Il y a eu un fil, il y a quelques jours qui utilisait cette technique.

l'autre solution c'est d'utiliser l'instruction GROUP_CONCAT() dans ta requête, de façon à concaténer toutes les catégories d'un article dans une chaine.
dans ce cas tu devras explode ta chaine pour en sortir un tableau de catégories , puis un foreach pour générer les badges.

TheMancunien, il y a 10 ans

Merci pour ta réponse Huggy
j'ai utilisé le GROUP_CONCAT()

<?php $selectArticle = $db->prepare('SELECT articles.id_article AS id, articles.titre_article AS titre FROM articles INNER JOIN jonction ON articles.id_article = jonction.id_article'); $selectArticle->execute() or die(print_r($selectArticle->errorInfo())); $articles = $selectArticle->fetchAll(PDO::FETCH_OBJ); $articleExistant = ""; ?> <?php foreach ($articles as $article): ?> <?php if ($articleExistant != $article): ?> <h3> <a href="#"><?php echo $article->titre; ?> <span class="badge"> <?php $selectCategories = $db->prepare('SELECT GROUP_CONCAT(categories.nom_categorie) AS concat_categories FROM categories INNER JOIN jonction ON categories.id_categorie = jonction.id_categorie WHERE jonction.id_article = :id_article'); $selectCategories->bindValue(':id_article', $article->id); $selectCategories->execute() or die(print_r($selectCategories->errorInfo())); $categories = $selectCategories->fetchAll(PDO::FETCH_OBJ); ?> <?php foreach ($categories as $categorie): ?> <?php echo $categorie->concat_categories; ?> <?php endforeach; ?> </span> </a> </h3> <hr> <?php $articleExistant = $article; ?> <?php endif ?> <?php endforeach; ?>
Huggy, il y a 10 ans

Oui, mais mon idée c'était de n'avoir qu'une seule requête
comme ceci

<?php $selectArticle = $db->prepare('SELECT A.id_article AS id, A.titre_article AS titre, GROUP_CONCAT(C.nom_categorie SEPARATOR ";") AS categs FROM articles A INNER JOIN jonction J ON A.id_article = J.id_article INNER JOIN categories C ON J.id_article = C.id_categorie GROUP BY id, titre'); $selectArticle->execute() or die(print_r($selectArticle->errorInfo())); $articles = $selectArticle->fetchAll(PDO::FETCH_OBJ); $articleExistant = ""; ?> <?php foreach ($articles as $article): ?> <?php if ($articleExistant != $article): ?> <h3> <a href="#"><?php echo $article->titre; ?> <?php $tab_categ = explode(';', $article.categs); foreach($tab_categ as $categ) : ?> <span class="badge"> <?php echo $categ; ?> </span> <?php endforeach; ?> </a> </h3> <hr> <?php $articleExistant = $article; ?> <?php endif ?> <?php endforeach; ?>
TheMancunien, il y a 10 ans

oui, c'est beaucoup mieux comme ça ^^ .. Merci encore une fois