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


kwik
Réponse acceptée

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é

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.

Bonjour.
Dans ta requête SQL tu ne fais pas réellement de jointure, tu devrais visionner Tutoriel Vidéo MySQL » Les jointures MySQL.

bobazaza
Auteur

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

Essaye peut être un

GROUP BY jeux.idjeu
bobazaza
Auteur

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
bobazaza
Auteur

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

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

bobazaza
Auteur

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