JeuWeb - Crée ton jeu par navigateur
Requête d'affichage des bâtiments en fonction de la race.. - 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 d'affichage des bâtiments en fonction de la race.. (/showthread.php?tid=469)



Requête d'affichage des bâtiments en fonction de la race.. - zneman - 01-01-2011

Bien le bonjour !
Cela fait des mois que je ne suis pas venu sur ce forum, il est temps pour moi de le re-fréquenter activement ! :amoureux2:

Quoi qu'il en soit, je commence par vous poser une petite colle ! (ou pas) Enfin bref, je bloque là dessus...

Voilà donc le problème:

Je veux: chercher tout les bâtiments de la table c_batiments et joindre les données de t_batiment en fonction de type= FK_cBatiment.
Avec FK_joueur = x OR FK_joueur IS NULL (ça ça marche pas Sad )
c_batiments contient les bâtiments disponibles dans le jeu, c'est à dire: le type de bâtiment (1 = maison, 2 = caserne par exemple), etc..
t_batiments contient les bâtiments que possède le joueur

Donc en gros, cette requête doit me chercher tous les bâtiments que je possède OU non.

-----------------------------

N'arrivant pas à faire ceci, je me suis porté sur un système à deux requêtes, une qui va chercher les bâtiments que j'ai et une autre qui va chercher les bâtiments que je n'ai pas encore (ceux qui sont donc dans c_batiment mais pas dans t_batiment).

Voila donc les requêtes qui ne fonctionnent pas (décidément, rien ne fonctionne ><)

Celle pour afficher les bâtiments qu'on possède:

Citation :SELECT * FROM t_batiment LEFT JOIN c_batiment ON t_batiment.FK_cBatiment = c_batiment.type WHERE FK_cRace = '3' AND t_batiment.FK_joueur = '17'

Celle pour afficher les bâtiment qu'on possède pas:

Citation :SELECT c_batiment.* FROM c_batiment WHERE FK_cRace = '3' AND type NOT IN( SELECT type FROM t_batiment LEFT JOIN c_batiment ON t_batiment.FK_cBatiment = c_batiment.type WHERE FK_cRace = '3' AND t_batiment.FK_joueur = '17' ORDER BY type) ORDER BY type

Merci d'avance à vous pour votre aide Smile Bonne année au passage ! Smile


RE: Requête d'affichage des bâtiments en fonction de la race.. - php_addict - 01-01-2011

as tu lu des tutos sur les jointures?

au pif:

LEFT JOIN t_batiments ON t_batiments.id = c_batiments.id


RE: Requête d'affichage des bâtiments en fonction de la race.. - zneman - 01-01-2011

Dans une jointure je crois qu'on peut aussi bien faire un
LEFT JOIN t_batiments ON t_batiments.id = c_batiments.id
qu'un
LEFT JOIN t_batiments ON c_batiments.id = t_batiment.id

Bien que je sois d'accord pour dire que c'est plus logique dans le premier cas de figure Smile (à confirmer si ça fonctionne dans les deux sens mais je pense que oui)
Quoi qu'il en soit, là n'est pas le problème :/


RE: Requête d'affichage des bâtiments en fonction de la race.. - niahoo - 01-01-2011

select c.*, t.player_id from c_batiments c left join t_batiments t on c.id = t.id and t.player_id = <id du joueur>

ou sinon la même en remplaçant 'and' par 'where' ce qui serait plus correct mais je me rappelle plus du comportement avec les left join, ça fait trop longtemps que j'ai pas tripatouillé de DB


RE: Requête d'affichage des bâtiments en fonction de la race.. - zneman - 01-01-2011

(01-01-2011, 07:24 PM)niahoo a écrit : select c.*, t.player_id from c_batiments c left join t_batiments t on c.id = t.id and t.player_id = <id du joueur>

ou sinon la même en remplaçant 'and' par 'where' ce qui serait plus correct mais je me rappelle plus du comportement avec les left join, ça fait trop longtemps que j'ai pas tripatouillé de DB


Non non, ceci ne change rien !
Ta requête est fonctionnelle mais n'affiche pas ce que je cherche :/
J'explique:
Si je me connecte avec le joueur "11" sa marche, mais si je me connecte avec le joueur 17 qui n'a pas le bâtiment en sa possession ça prendra la première information que MySQL trouvera qui complète la jointure(les données du joueur 11) et vu que FK_joueur sera égal à 11 et non à 17, le joueur 17 ne verra rien d'affiché, ce qui m'embête car je recherche un affichage absolument moi ! Smile

Merci à vous de m'aider à chercher ! Smile


RE: Requête d'affichage des bâtiments en fonction de la race.. - Hideaki - 01-01-2011

Bonjour !

Essaye cette requête, elle devrait te renvoyer la liste des bâtiments, si les colonnes liées à t_batiment sont null, c'est qu'il ne les a pas Wink


SELECT * FROM c_batiment
LEFT OUTER JOIN t_batiment
ON t_batiment.FK_cBatiment = c_batiment.type
AND t_batiment.FK_joueur = '17' AND FK_cRace = '3'

Sinon voici le meilleur site contenant des tutoriels et des cours SQL du net en langue française.


RE: Requête d'affichage des bâtiments en fonction de la race.. - zneman - 01-01-2011

(01-01-2011, 07:45 PM)Hideaki a écrit : Bonjour !

Essaye cette requête, elle devrait te renvoyer la liste des bâtiments, si les colonnes liées à t_batiment sont null, c'est qu'il ne les a pas Wink


SELECT * FROM c_batiment
LEFT OUTER JOIN t_batiment
ON t_batiment.FK_cBatiment = c_batiment.type
AND t_batiment.FK_joueur = '17' AND FK_cRace = '3'

Sinon voici le meilleur site contenant des tutoriels et des cours SQL du net en langue française.

En effet, cette requête fonctionne ! Big Grin Je ne connaissais pas le OUTER (ou alors je l'ai zappé lors d'un de mes cours de SQL...).
Petite modification toutefois pour ne pas prendre tous les bâtiments de toutes les races:


SELECT * FROM c_batiment
LEFT OUTER JOIN t_batiment
ON t_batiment.FK_cBatiment = c_batiment.type and t_batiment.FK_joueur = '17' WHERE c_batiment.FK_cRace = '3'

Merci beaucoup à toi, c'est sur ce genre de problème qu'on bloque parfois longtemps ^^