JeuWeb - Crée ton jeu par navigateur
Requête, boucle et jointure - 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 : Requête, boucle et jointure (/showthread.php?tid=2255)

Pages : 1 2


RE: Requête, boucle et jointure - Sephi-Chan - 08-01-2008

Je t'en prie. Smile

Concernant l'utilisation d'une table au lieu de deux (je pense que tu parles de Monstre_a_Etat et Joueur_a_Etat ?), franchement, je ne trouve pas : une base de donnée relationnelle fonctionne bien grâce à un éclatement cellulaire, on ne doit pas pouvoir diviser les tables davantage. Et puis, il ne faut pas avoir peur du nombre de table. Les tables de relations ne pèsent rien puisque tu ne stockes que des chiffres :
  • Un TINYINT occupe 1 octet, avec l'intervalle [-128; +127] ou [0; +255] en UNSIGNED.
  • Un SMALLINT occupe 2 octet, avec l'intervalle [-32768; +32767] ou [0; +65535] en UNSIGNED.
  • Un MEDIUMINT occupe 3 octet, avec l'intervalle [-8388608; +8388607] ou [0; +16777215] en UNSIGNED.
Avec ça tu fais tout et tu ne manques pas de places. Smile


Sephi-Chan


RE: Requête, boucle et jointure - phenix - 09-01-2008

Yop, je contienue le sujet, j'ai un autre problème du même type :pleure2:

Je voudrais faire un script qui gère l'IA des monstres, pour cela il me faut certaine donnée:

- Les info de chaque monstre (dans la table monstre).
- Tout les personnage sur la même map et leur info.
- Les caractéristiques des objets porter par les personnages.

J'ai tenter sa:

Code :
SELECT
                    monstre.id AS id_monstre,
                    monstre.nom AS mon_monstre,
                    monstre.niveau AS niveau_monstre,
                    monstre.lieu AS lieu_monstre,
                    monstre.quartier AS quartier_monstre,
                    monstre.forceu AS for_monstre,
                    monstre.dexterite AS dex_monstre,
                    monstre.endurance AS end_monstre,
                    monstre.pouvoir AS pouv_monstre,
                    monstre.PV AS PV_monstre,
                    monstre.armure AS armure_monstre,
                    monstre.degat_min AS degat_min_monstre,
                    monstre.degat_max AS degat_max_monstre,
                    monstre.position AS position_monstre,
                    
                    users.id AS id_users,
                    users.lieu AS lieu_users,
                    users.quartier AS quartier_users,
                    users.pseudo AS pseudo_users,
                    users.niv AS niveau_users,
                    users.forceu AS for_users,
                    users.dexterite AS dex_users,
                    users.endurance AS end_users,
                    users.pouvoir AS pouv_users,
                    users.PV AS PV_users,
                    users.arme AS arme_users,
                    users.armure AS armure_users,
                    users.tete AS tete_users,
                    users.jambe AS jambe_users,
                    users.bouclier AS bouclier_users,
                    users.gant AS gant_users,
                    users.orientation AS orientation_users,
                    users.position AS position_users,
                    
                    objet.degat_max AS degat_max,
                    objet.degat_min AS degat_min,
                    objet.armure AS armure_objet,
                    objet.foru AS rune_for,
                    objet.dex AS rune_dex,
                    objet.end AS rune_end,
                    objet.pouv AS rune_pouv
                    
                    FROM monstre

                    INNER JOIN users ON monstre.lieu = users.lieu AND monstre.quartier = users.quartier
                    INNER JOIN objet ON objet.objet = users.arme OR objet.objet = users.armure OR objet.objet = users.tete OR objet.objet = users.jambe OR objet.objet = users.bouclier OR objet.objet = users.gant

Le problème ce situe au niveau des objets, il retourne les informations du dernier objet. Ors il me faudrais les informations de tout les objets. Voir mieux, qu'il fasse lui même les additions et renvoie le résultat (addtionné l'armure de tout les objets, etc.).

Si quelqu'un a une solution, je suis preneur :wowowow:

Amicalement,

Phenix


RE: Requête, boucle et jointure - phenix - 10-01-2008

Petit Up, on a du m'oublier :toilette:


RE: Requête, boucle et jointure - Sephi-Chan - 10-01-2008

Le Up n'est autorisé qu'après 48h.

Concernant ton problème, il est assez lourd à traiter, je te déconseille de le faire avec la base de donnée uniquement.

Je profite de l'occasion de te donner un conseil. Plutôt qu'aliaser tous tes champs, pourquoi ne les nomme-tu pas directement bien ?


Sephi-Chan


RE: Requête, boucle et jointure - phenix - 10-01-2008

Citation :Le Up n'est autorisé qu'après 48h.

Ha, désoler.

Citation :Concernant ton problème, il est assez lourd à traiter, je te déconseille de le faire avec la base de donnée uniquement.

Cela veux-t'il dire que je dois récupérer les infos des objets dans la boucle ? Ou bien existe t'il un moyen de récupérer les info des objets dans la jointure tout et faire les calcules avec PHP ?

Citation :Je profite de l'occasion de te donner un conseil. Plutôt qu'aliaser tous tes champs, pourquoi ne les nomme-tu pas directement bien ?

Parce qu'aux début, je ne connaissais pas les jointures, je me suis dit que j'allais nommer tout les champs de la même manière pour me retrouver plus facilement. Je me trompais visiblement... Je changerais cela à l'occasion (h)

Amicalement,

Phenix


RE: Requête, boucle et jointure - Sephi-Chan - 10-01-2008

Concernant l'équipement, je ne sais pas si tu t'y prends comme il faut.

Une bonne structure pourrait être d'avoir, en plus de ta table Monstres et de la tables Objets, une table Monstre_a_objet qui associerai l'id d'un monstre à l'id d'un objet et éventuellement, l'id d'un emplacement sur le corps (dont les noms peuvent êtres décrits dans une autre table Emplacements, il ne faut par contre pas mettre le nom directement sinon tu gâcheras de l'espace).

Ainsi, tu peux faire une requête du style :

Code :
SELECT M.*, E.*, Emp.*
FROM Monstres M
LEFT JOIN Monstre_a_objet MaO ON MaO.id_monstre = M.id_monstre
LEFT JOIN Objets O ON O.id_objet = MaO.id_objet
LEFT JOIN Emplacements Emp ON Emp.id_emplacement = MaO.id_emplacement
WHERE M.id_monstre = 1;
J'ai mis 1 dans le WHERE, mais tu mets bien sûr ce que tu veux.

Ensuite, ça te sort plusieurs lignes (autant que le monstre a de pièces d'équipement). La première partie de ces lignes sera toujours la même et contiendra les informations sur le monstre. La seconde partie du résultat contiendra les informations sur les objets et la dernière partie contiendra l'emplacement où l'objet est porté.

Ensuite la petite difficulté est d'addition les caractéristiques de chacun des objets et séparément, celui du monstre. Cela n'est pas extrêmement difficile et on pourra t'aider si tu ne trouves pas comment t'y prendre seul.


Sephi-Chan


RE: Requête, boucle et jointure - phenix - 10-01-2008

Je crois qu'il y a eu un quiproquo quelques part, ce ne sont pas les monstres qui on un équipement, mais les joueurs (cible potentiel du monstre). Les monstres on un profile fixe stoker dans la base de donnée. Mais je suppose que tu me conseillerais le même principe.

L'emplacement des objets sur le joueur n'as pas vraiment d'importance, c'est surtout le contenu de la table objet qu'il faut avoir. Mais avec ton système je devrais avoir un truc du style:

- Récupération des donnée du monstre et des cibles potentieles
- début de la Boucles
- En cas de cible a attaquer, récupérer les donnée des objets
- Attaque
- Fin de la boucle.

C'est pas un peut trop lourd, surtout s'il y a 400 monstres a faire comme sa ?

Merci de ton aide,

Phenix