07-01-2008, 11:11 PM
Je vais faire un exemple de jointure pour les altérations, le principe peut être appliqué à plein de choses après. Le tout, c'est d'avoir une structure en 3 tables (ou plus, parfois).
Je te conseille par contre, dans tes noms de champs, de rappeler la table. Par exemple dans la table Monstres, tu appelle l'id id_monstre, ça te permet d'éviter de devoir aliaser chaque champ !
Remplissons les tables :
Etat (id_etat, nom_etat) (on les effets ne nous intéressent pas pour le moment), qui contient la liste des différents altérations d'état possibles. Je doute qu'il y en ai plus que 255.
Ensuite, remplissons, la table listeMonstre (id_monstre, nom_monstre, pv_max), qui instancie les modèles de monstres :
Imaginons pendant le jeu qu'un personnage jette un sortilège qui paralyse sa cible sur un Chocobo noir. Alors tu créeras dans la table Monstre_a_Etat (id_monstre, id_etat, duree_effet) une relation :
3 (l'id du monstre (id_monstre de la table Monstres) affecté), 3 (l'id de l'altération d'état (id_etat de la table Etats) qui affecte le monstre), 5 (le nombre de tours de combat durant laquelle l'altération fait effet. Tu le réduit de 1 à chaque tour, quand il atteint 0).
Ainsi, il devient possible d'affecter plusieurs altérations d'état à un même monstre !
Imaginons donc qu'un joueur rende malade ce même Chocobo noir, le pauvre ! Alors là, rebelotte, on insère une nouvelle entrée dans la table Monstre_a_Etat :
3 (l'id du monstre Chocobo noir), 4 (l'id de l'altération Maladie), 2 (la durée de l'effet)
En pratique, quand tu vas résoudre ton combat, pour récupérer les informations sur les caractéristiques et les altérations d'état du monstre, tu feras un script comme ça :
J'explique ma requête, on sélectionne toutes les informations de la table Monstres, on va chercher dans la table de relation Monstre_a_Etat si l'id du monstre s'y trouve (le LEFT devant le JOIN sert à sélectionner quand même les informations du monstres s'il n'a aucune altération, mais c'est un détail), si oui, alors on va chercher dans la table Etats ceux qui ont l'id de (ou des) altérations trouvées précédemment dans la table Monstre_a_Etat.
Comme tu le vois, on utilise à chaque fois l'id du monstre actuellement parcouru par SQL quand il parcourt les tables à l'exécution de la requête. On spécifie en l'occurrence la bête d'id 3 à la fin, mais si on ne met pas de WHERE, ça sort toutes les bêtes et leurs altérations d'état !
Ça nous sort une ressource genre (je n'écris pas tous les champs dans mon exemple car ce serait trop long pour moi de les lister) :
Ce résultat est un peu particulier à exploiter vu qu'il y a des doublons, mais c'est en fait très facile à faire avec PHP (on pourra t'expliquer au besoin).
Voilà, j'espère que ça t'aura aidé à comprendre le fonctionnement !
Sephi-Chan
Je te conseille par contre, dans tes noms de champs, de rappeler la table. Par exemple dans la table Monstres, tu appelle l'id id_monstre, ça te permet d'éviter de devoir aliaser chaque champ !
Remplissons les tables :
Etat (id_etat, nom_etat) (on les effets ne nous intéressent pas pour le moment), qui contient la liste des différents altérations d'état possibles. Je doute qu'il y en ai plus que 255.
Citation :1, Stupidité
2, Fureur
3, Paralysie
4, Maladie
…
Ensuite, remplissons, la table listeMonstre (id_monstre, nom_monstre, pv_max), qui instancie les modèles de monstres :
Citation :1, Chevalier de sang, 60000
2, Anaconda, 3200
3, Chocobo noir, 18000
…
Imaginons pendant le jeu qu'un personnage jette un sortilège qui paralyse sa cible sur un Chocobo noir. Alors tu créeras dans la table Monstre_a_Etat (id_monstre, id_etat, duree_effet) une relation :
3 (l'id du monstre (id_monstre de la table Monstres) affecté), 3 (l'id de l'altération d'état (id_etat de la table Etats) qui affecte le monstre), 5 (le nombre de tours de combat durant laquelle l'altération fait effet. Tu le réduit de 1 à chaque tour, quand il atteint 0).
Ainsi, il devient possible d'affecter plusieurs altérations d'état à un même monstre !
Imaginons donc qu'un joueur rende malade ce même Chocobo noir, le pauvre ! Alors là, rebelotte, on insère une nouvelle entrée dans la table Monstre_a_Etat :
3 (l'id du monstre Chocobo noir), 4 (l'id de l'altération Maladie), 2 (la durée de l'effet)
En pratique, quand tu vas résoudre ton combat, pour récupérer les informations sur les caractéristiques et les altérations d'état du monstre, tu feras un script comme ça :
Code :
SELECT M.*, E.*, ME.duree_effet
FROM Monstres M
LEFT JOIN Monstre_a_Etat ME ON ME.id_monstre = M.id_monstre
LEFT JOIN Etats E ON E.id_etat = ME.id_etat
WHERE M.id_monstre = 3;
J'explique ma requête, on sélectionne toutes les informations de la table Monstres, on va chercher dans la table de relation Monstre_a_Etat si l'id du monstre s'y trouve (le LEFT devant le JOIN sert à sélectionner quand même les informations du monstres s'il n'a aucune altération, mais c'est un détail), si oui, alors on va chercher dans la table Etats ceux qui ont l'id de (ou des) altérations trouvées précédemment dans la table Monstre_a_Etat.
Comme tu le vois, on utilise à chaque fois l'id du monstre actuellement parcouru par SQL quand il parcourt les tables à l'exécution de la requête. On spécifie en l'occurrence la bête d'id 3 à la fin, mais si on ne met pas de WHERE, ça sort toutes les bêtes et leurs altérations d'état !
Ça nous sort une ressource genre (je n'écris pas tous les champs dans mon exemple car ce serait trop long pour moi de les lister) :
Citation :id_monstre, nom_monstre, …, id_maladie, nom_maladie, …, duree_effet
3, Chocobo noir, …, 3, Paralysie, …, 5
3, Chocobo noir, …, 4, Maladie, …, 2
Ce résultat est un peu particulier à exploiter vu qu'il y a des doublons, mais c'est en fait très facile à faire avec PHP (on pourra t'expliquer au besoin).
Voilà, j'espère que ça t'aura aidé à comprendre le fonctionnement !
Sephi-Chan