Jointure à la façon HABTM

Par bobazaza, il y a 9 ans


Bonjour,

Voila je rencontre un petit problème avec mon code.

Ce que je fais

J'ai les table jeux, genres et jeux_genres. Je souhaite avoir plusieurs genres dans un jeu (mais un genre peut être dans plusieurs jeux)

Dans la table jeux, j'ai l'id, libelle, etc
Dans la table genres j'ai l'id et le libelle
Dans la table jeux_genres j'ai l'id, et les deux clé etrangeres id_jeux et id_genres

je fais un petit test

<?php $bdd = new PDO('mysql:host=localhost;dbname=test','root',''); $requete = $bdd->prepare("SELECT jg.id_jeux_genres, j.libelle, j.prix, j.stock, j.date_sortie, j.description, j.note, j.image, g.libelle_genre FROM jeux j, jeux_genres jg, genres g WHERE j.idjeu = jg.id_jeux AND jg.id_genres = g.idgenre "); $requete->execute(); $r =$requete->fetchAll(PDO::FETCH_OBJ); var_dump($r);exit(); foreach($r as $val) { echo $val->libelle." "; }

Ce que je veux

Retourner une seule fois un jeu avec ses informations et tous ses genres

Ce que j'obtiens

j'ai plusieurs fois le jeu pour un genre (j'ai l'inverse de ce que je veux)

merci d'avance pour votre aide =)

9 réponses

SimonDevelop, il y a 9 ans

un schéma de ta base ne serai pas de refu, mais si je comprend bien t'a requête, tu ne met pas de condition qui permet de retourner qu'un seul jeu et tu a mis des conditions pour que les liaisons entre les tables soit bonnes c'est tout, rajoute une condition pour dire que tu souhaite avoir telle jeu, ou si tu veux choper que le premier tu rajoute un limit 1 => Mysql Limit.

bobazaza, il y a 9 ans

Merci pour vos réponses j'ai regardé le tuto

J'ai essayé ceci:

SELECT jeux.libelle, jeux.prix , genres.libelle_genre FROM jeux LEFT JOIN jeux_genres AS jg ON jg.id_jeux = jeux.idjeu LEFT JOIN genres ON genres.idgenre = jg.id_genres

Mais ça revient exactement à la même chose... j'ai pour chaque genre un jeu et j'essaie d'avoir l'inverse avoir pour un seul jeu tous ses genres

Fukotaku oui mais j'essaie d'avoir pour chaque jeu tous ses genres mais je ne vois pas comment faire... :/

E-Bismuth, il y a 9 ans

Essaye peut être un

GROUP BY jeux.idjeu
bobazaza, il y a 9 ans

J'ai déjà essayé avec le group by (tuto sur les requetes sql)

SELECT jeux.libelle, jeux.prix , genres.libelle_genre FROM jeux LEFT JOIN jeux_genres AS jg ON jg.id_jeux = jeux.idjeu LEFT JOIN genres ON genres.idgenre = jg.id_genres GROUP BY jeux.idjeu

Je tombe sur:

1055 - Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'test.genres.libelle_genre' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

et en y ajoutant le count

SELECT COUNT (jeux.idjeu) AS nb, jeux.libelle, jeux.prix , genres.libelle_genre FROM jeux LEFT JOIN jeux_genres AS jg ON jg.id_jeux = jeux.idjeu LEFT JOIN genres ON genres.idgenre = jg.id_genres GROUP BY jeux.idjeu

1630 - FUNCTION test.COUNT does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual

kwik, il y a 9 ans

Bonjour

Essaye avec GROUP_CONCAT() et GROUP_BY

SELECT j.libelle, j.prix, GROUP_CONCAT(g.libelle_genre SEPARATOR ',') AS genres FROM jeux AS j LEFT JOIN jeux_genres AS jg ON jg.jeu_id = j.id LEFT JOIN genres AS g ON g.id = jg.genre_id GROUP BY j.id

Je ne sais pas, si c'est la meilleur solution mais ca devrait fonctionné

bobazaza, il y a 9 ans

C'est une solution merci et vous savez comment le mettre sous forme de tableau? Car c'est juste une chaine de caractère
1 =>
object(stdClass)[4]
public 'libelle' => string 'assassin's creed syndicate' (length=26)
public 'prix' => string '19.99' (length=5)
public 'genres' => string 'aventure,action' (length=15)

sinon j'ai dans l'idée de mettre ce string en deux éléments de tableau mais ce n'est pas terrible ma méthode =/

kwik, il y a 9 ans

Je ne sais pas si c'est possible directement en sql, mais tu peux utiliser la fonction explode de php ?

bobazaza, il y a 9 ans

Je viens de test ça marche super ! Merci ! =)