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 ! 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é ! -------- 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 :
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 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 ). 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 ! 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 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 faut juste testé si id_joueur est null ou non Pensez pas ? |