Impossible à concevoir cette requête

Eléphant du PHP | 153 Messages

25 juil. 2007, 16:40

Bonjour à tous !

Désolé pour le titre, mais je n'étais pas très inspiré pour nommer correctement le problème. Si vous avez des idées, dites je modifierai.

J'ai un problème (étonnant !) et ma version que j'utilise est MySQL 5.

Je conçois un jeu où l'on peut acheter des bâtiments et pour acheter ces bâtiments il peut falloir posséder certains bâtiments prérequis.

Ma base de données ressemble à cela :
batiment (idbatiment, idtypebatiment, idjoueur),
type_batiment (idtypebatiment, label),
type_batiment_need (idtypebatiment, idtypebatimentneed)


type_batiment_need : le bâtiment idtypebatiment a besoin du idtypebatimentneed pour être construit, il peut avoir plusieurs enregistrements, comme un bâtiment ne peut avoir aucun prérequis (par exemple le tout premier bâtiment à construire).

Quelle requête faut-il faire pour pouvoir avoir la liste des bâtiments qu'il peut construire ? C'est à dire, qu'elle est la liste des bâtiments dont le joueur possède tous les bâtiments requis ?

Merci beaucoup !

Je suis parti dans des requêtes imbriquées mais ça ne marche pas... Je n'arrive pas à comparer tous les bâtiments need s'il y en a plusieurs et je dois faire une autre requête pour ceux qui n'ont pas de prérequis.
Je ne vous poste donc pas ma requête actuelle afin de ne pas vous influencer.
http://gl2.delcedo.com/ Galaxialord 2 !

Mammouth du PHP | 19672 Messages

25 juil. 2007, 19:24

Des "SHOW CREATE TABLE" + un petit jeu d'essai, ce serait pratique pour aider à te répondre, on pourrait tester en local avant de te répondre n'importe quoi à la louche et c'est pas toujours tentant de se le faire soi-même juste pour te trouver une solution :-k
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 153 Messages

25 juil. 2007, 21:01

Voilà voilà !

A copier coller pour créer la structure énoncée plus haut et insérer un jeu de test.

En espérant que ça aidera :) d'avance merci de votre aide !

Code : Tout sélectionner

-- -- Structure de la table `batiment` -- DROP TABLE IF EXISTS `batiment`; CREATE TABLE `batiment` ( `idbatiment` int(10) unsigned NOT NULL auto_increment, `idtypebatiment` int(10) unsigned NOT NULL, `idjoueur` int(10) unsigned NOT NULL, PRIMARY KEY (`idbatiment`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ; -- -- Contenu de la table `batiment` -- INSERT INTO `batiment` (`idbatiment`, `idtypebatiment`, `idjoueur`) VALUES (1, 9, 1); INSERT INTO `batiment` (`idbatiment`, `idtypebatiment`, `idjoueur`) VALUES (2, 10, 1); -- -------------------------------------------------------- -- -- Structure de la table `type_batiment` -- DROP TABLE IF EXISTS `type_batiment`; CREATE TABLE `type_batiment` ( `idtypebatiment` int(10) unsigned NOT NULL auto_increment, `label` varchar(50) NOT NULL, PRIMARY KEY (`idtypebatiment`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=13 ; -- -- Contenu de la table `type_batiment` -- INSERT INTO `type_batiment` (`idtypebatiment`, `label`) VALUES (1, 'Batiment 0 nécessaire dispo'); INSERT INTO `type_batiment` (`idtypebatiment`, `label`) VALUES (2, 'Batiment 1 nécessaire dispo (1/1)'); INSERT INTO `type_batiment` (`idtypebatiment`, `label`) VALUES (3, 'Batiment 2 nécessaire dispo (2/2)'); INSERT INTO `type_batiment` (`idtypebatiment`, `label`) VALUES (4, 'Batiment 1 nécessaire indispo (0/1)'); INSERT INTO `type_batiment` (`idtypebatiment`, `label`) VALUES (5, 'Bâtiment 2 nécessaire indispo (0/2 possédé)'); INSERT INTO `type_batiment` (`idtypebatiment`, `label`) VALUES (6, 'Bâtiment 2 nécessaire indispo (1/2 possédé)'); INSERT INTO `type_batiment` (`idtypebatiment`, `label`) VALUES (7, 'Bâtiment 2 nécessaire indispo (1/2 possédé) bi'); INSERT INTO `type_batiment` (`idtypebatiment`, `label`) VALUES (9, 'Batiment possédé n°1'); INSERT INTO `type_batiment` (`idtypebatiment`, `label`) VALUES (10, 'Batiment possédé n°2'); INSERT INTO `type_batiment` (`idtypebatiment`, `label`) VALUES (11, 'Batiment non possédé n°1'); INSERT INTO `type_batiment` (`idtypebatiment`, `label`) VALUES (12, 'Batiment non possédé n°2'); -- -------------------------------------------------------- -- -- Structure de la table `type_batiment_need` -- DROP TABLE IF EXISTS `type_batiment_need`; CREATE TABLE `type_batiment_need` ( `idtypebatiment` int(10) unsigned NOT NULL, `idtypebatimentneed` int(10) unsigned NOT NULL, PRIMARY KEY (`idtypebatiment`,`idtypebatimentneed`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; -- -- Contenu de la table `type_batiment_need` -- INSERT INTO `type_batiment_need` (`idtypebatiment`, `idtypebatimentneed`) VALUES (2, 9); INSERT INTO `type_batiment_need` (`idtypebatiment`, `idtypebatimentneed`) VALUES (3, 9); INSERT INTO `type_batiment_need` (`idtypebatiment`, `idtypebatimentneed`) VALUES (3, 10); INSERT INTO `type_batiment_need` (`idtypebatiment`, `idtypebatimentneed`) VALUES (4, 11); INSERT INTO `type_batiment_need` (`idtypebatiment`, `idtypebatimentneed`) VALUES (5, 11); INSERT INTO `type_batiment_need` (`idtypebatiment`, `idtypebatimentneed`) VALUES (5, 12); INSERT INTO `type_batiment_need` (`idtypebatiment`, `idtypebatimentneed`) VALUES (6, 9); INSERT INTO `type_batiment_need` (`idtypebatiment`, `idtypebatimentneed`) VALUES (6, 11); INSERT INTO `type_batiment_need` (`idtypebatiment`, `idtypebatimentneed`) VALUES (7, 9); INSERT INTO `type_batiment_need` (`idtypebatiment`, `idtypebatimentneed`) VALUES (7, 11);
Edit:

Ce qui doit être obtenu après la requête SQL c'est les 3 différents bâtiments marqués dispo, et aucun autre.
http://gl2.delcedo.com/ Galaxialord 2 !

Mammouth du PHP | 19672 Messages

25 juil. 2007, 22:51

Ce qui doit être obtenu après la requête SQL c'est les 3 différents bâtiments marqués dispo, et aucun autre.
Avec le jeu d'essai, ça devrait se faire : mais j'ai du mal à comprendre les règles de gestion qui permettraient d'aboutir au résultat souhaité...
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 153 Messages

26 juil. 2007, 00:00

En fait voilà ce que je souhaite.

Le joueur possède des bâtiments dans la table batiment.

En fonction des bâtiments qu'il possède, il peut obtenir des bâtiments supplémentaires qui dépendent de ces précédents (exemple : en construisant une école, on pourra avoir accès à un collège, puis en construisant le collège avoir accès à un lycée etc...).

Certains bâtiments peuvent être dépendant de deux autres bâtiments (exemple concrêt : pour construire une université il faudra avoir un "lycée" ainsi qu'un "laboratoire de recherche").

Ces dépendences sont réalisées par la table type_batiment_need.

Et donc mon problème c'est : comment faire pour obtenir la liste des bâtiments qui pourraient être construits ?

C'est plus clair ?


***

C'est bon j'ai trouvé !

Merci à tous ceux qui ont voulu m'aider.

Je mettrai bien mon SQL mais euh comment dire... la version de la base de données que j'avais énoncé plus haut était simplifié, et ma requête prend une 70aine de ligne (8 tables associés). J'essaierai donc de mettre une version simplifiée qui correspondra à l'exemple ci-dessus (si ca intéresse quelqu'un).
http://gl2.delcedo.com/ Galaxialord 2 !