JeuWeb - Crée ton jeu par navigateur
SQL... La colle ! - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : SQL... La colle ! (/showthread.php?tid=5351)

Pages : 1 2


SQL... La colle ! - zneman - 02-04-2011

Bien le bonjour ! Smile
Je viens ici car je me retrouve avec un bon problème sur le dos et je n'arrive vraiment pas à le résoudre....

J'explique:

le joueur = Pk_joueur

les fortifications qui existent sont dans la table c_fortification un peu comme ça:
Pk_fortif | nom | prix |..
1 - fortif1 - 200
2 - fortif2 - 400
3 - fortif3 - 700

Ensuite, les fortifications achetées par les membres sont dans t_fortification sous la forme:
Pk_fortif | FK_joueur | FK_fortif
-----------
PK forti est simplement l'id pour différencier les entrées...
FK_joueur fait référence au PK_joueur qui correspond donc à un joueur
FK_fortif fait référence au PK_fortif de la table c_fortification pour dire quelle fortif a le membre.

Le problème c'est que je dois faire une boucle qui liste au joueur les fortifications disponibles ainsi que celles qu'il a.

Je devrais donc faire une requête qui va chercher dans c_fortification et t_fortification les fortifications existantes et celles qu'a le joueur, tout en différenciant bien celles qu'il a (qui se trouvent dans t_fortification) et celles qu'il n'a pas (dans c_fortification).
Le but étant de mettre un "bouton acheter" sur celles qu'il n'a pas et de ne pas mettre ce dernier sur les fortifs qu'il a déjà acheté ! Big Grin

--------

De base, je pensais faire cela: chercher les fortifs existantes, PUIS chercher les fortifs du membres puis afficher les fortifs existantes en comparant à chaque fois avec celles du membre pour voir s'il ne l'a pas déjà... enfin bon, ça me fait deux requêtes, des boucles et un système vraiment pas top :/

Je vous demande donc votre avis sur la question et la façon dont je pourrais faire cela ! :p


RE: SQL... La colle ! - php_addict - 02-04-2011

jointure INNER JOIN ?


RE: SQL... La colle ! - zneman - 02-04-2011

Oui, je pense bien à cela pour éviter les doublons, mais à ce moment, comment choisir les entrées de t_fortification à la place de c_fortification ? et comment les reconnaître une fois dans ma boucle ? là est la question (je n'utilise jamais le Inner en plus donc je vais un peu me renseigner sur son fonctionnement).


RE: SQL... La colle ! - Sephi-Chan - 02-04-2011

Il te faut une requête du type :


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


RE: SQL... La colle ! - zneman - 02-04-2011

Oula, je ne me souvenais même plus qu'on puisse utiliser des IF dans une requête ?! o_O
Je vais donc m'aider de ça, je vous dis si jamais ça bloque !

Merci pour tes explications Sephi ! (ainsi que Php_addict Smile ).


RE: SQL... La colle ! - Sephi-Chan - 02-04-2011

J'ai mis à jour mon post pour que la requête soit plus intelligente.
J'en ai profité pour étoffer l'explication.


Sephi-Chan


RE: SQL... La colle ! - zneman - 02-04-2011

Très instructif, merci beaucoup l'ami, je me coucherais un peu moins bête ce soir ! Smile


RE: SQL... La colle ! - Dexyne - 02-04-2011

Je savais même pas que des IF pouvaient s'utiliser dans des requêtes :o. Intéressant.


RE: SQL... La colle ! - Sephi-Chan - 02-04-2011

MySQL - Les fonctions de contrôle Smile


RE: SQL... La colle ! - Ter Rowan - 03-04-2011

j'ai appris un truc avec ce if ^^


mais est ce utile par rapport à :
Code :
SELECT F.*, FJ.id as id_joueur
FROM fortifications AS F
LEFT JOIN fortifications_joueurs AS FJ ON FJ.fortification_id = F.id AND FJ.joueur_id = 1;

faut juste testé si id_joueur est null ou non

Pensez pas ?