02-04-2011, 04:03 PM
(Modification du message : 02-04-2011, 05:05 PM par Sephi-Chan.)
Il te faut une requête du type :
Ainsi, tu récupères une ligne par fortification du jeu (dans la table fortifications, aliasée F), puis pour chaque fortification, tu cherches s'il existe une entrée dans la table de liaison pour ce couple (joueur_id; fortification_id). Grâce à la jointure externe (LEFT, ici), si une telle ligne n'existe pas, la ligne sera tout de même retournée et elle ne contiendra que les informations de la fortification : les colonnes de la table fortifications_joueurs auront la valeur NULL.
Pour illustrer mon propos, voici le jeu de résultat retourné (avec une base de tests crée pour l'occasion). J'ai ajouté dans le SELECT un FJ.* afin de montrer la valeur des colonnes de la table de liaison, pour qu'on voit bien ce que ça donne quand un joueur ne possède pas la fortification. Si on avait fait une jointure interne (c'est le cas quand on met INNER JOIN ou JOIN tout seul), la ligne pour la fortification en acier n'aurait pas été retournée du tout.
Sephi-Chan
SELECT F.*, IF(FJ.id IS NULL, 1, 0) AS disponible
FROM fortifications AS F
LEFT JOIN fortifications_joueurs AS FJ ON FJ.fortification_id = F.id AND FJ.joueur_id = 1;
Ainsi, tu récupères une ligne par fortification du jeu (dans la table fortifications, aliasée F), puis pour chaque fortification, tu cherches s'il existe une entrée dans la table de liaison pour ce couple (joueur_id; fortification_id). Grâce à la jointure externe (LEFT, ici), si une telle ligne n'existe pas, la ligne sera tout de même retournée et elle ne contiendra que les informations de la fortification : les colonnes de la table fortifications_joueurs auront la valeur NULL.
Pour illustrer mon propos, voici le jeu de résultat retourné (avec une base de tests crée pour l'occasion). J'ai ajouté dans le SELECT un FJ.* afin de montrer la valeur des colonnes de la table de liaison, pour qu'on voit bien ce que ça donne quand un joueur ne possède pas la fortification. Si on avait fait une jointure interne (c'est le cas quand on met INNER JOIN ou JOIN tout seul), la ligne pour la fortification en acier n'aurait pas été retournée du tout.
+----+--------+------------+------+------------------+-----------+
| id | name | disponible | id | fortification_id | joueur_id |
+----+--------+------------+------+------------------+-----------+
| 1 | Bois | 0 | 1 | 1 | 1 |
| 2 | Pierre | 0 | 2 | 2 | 1 |
| 3 | Acier | 1 | NULL | NULL | NULL |
+----+--------+------------+------+------------------+-----------+
Sephi-Chan