Précédent   Forum des professionnels en informatique > Bases de données > MySQL > SQL Procédural
SQL Procédural Forum d'entraide sur les triggers, les procédures stockées et les fonctions en MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 11/07/2007, 21h00   #1
Futur Membre du Club
 
Inscription : mars 2006
Messages : 106
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 106
Points : 18
Points : 18
Par défaut [MySQL 5.0] Requête complexe

Bonjour

Je suis en train d'essayer de faire un jeu en ligne pour m'améliorer en PHP, et je bloque sur un point.

Je vous explique la situation vite fait : un bâtiment peut nécessiter, pour être débloqué, un ou plusieurs autres batiments (pré requis donc)
exemple concret : pour construire le batiment 5 il me faut les bâtiments 2 et 4, ainsi qu'une technologie particulière.

J'ai donc fait cette structure de tables :


Mais je n'arrive pas à voir quelle requête me permettrai d'avoir le nom du bâtiment en question, + le nom de ses bâtiments prérequis, + le nom des technologies prérequises

Merci d'avance pour votre aide

ps : si vous avez une autre idée de structure de tables ça me va aussi
ps2 : peut-on réellement faire tout ça en une requête ?
TheDoci est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2007, 21h34   #2
Modérateur
 
Avatar de mathieu
 
Inscription : juin 2003
Messages : 4 893
Détails du profil
Informations forums :
Inscription : juin 2003
Messages : 4 893
Points : 4 466
Points : 4 466
Citation:
Envoyé par stargatefan
ps : si vous avez une autre idée de structure de tables ça me va aussi
là ça me va, les tables ont l'air t'être bien structurées

Citation:
Envoyé par stargatefan
ps2 : peut-on réellement faire tout ça en une requête ?
je ne crois pas parce que à partir d'un "id_batiment" tu as un liste de bâtiments requis et une liste de technologie requis donc ça fait 2 types d'objets différents

mais suivant le SGBD que tu utilises (MySQL ?) et la version, tu as peut-être à disposition des fonctions avancées pour faire une "union" des 2 requêtes en une seule
__________________
Modérateur PHP
mathieu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2007, 23h47   #3
Futur Membre du Club
 
Inscription : mars 2006
Messages : 106
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 106
Points : 18
Points : 18
Merci pour ta réponse mais je ne vois pas trop comment me servir des Unions.
Etant donné que tous les résultats sont "collés" les uns aux autres, comment différencier ce qui appartient à chaque bâtiment ?

ps : j'ai bien MySQL 5
TheDoci est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/07/2007, 01h48   #4
Membre du Club
 
Inscription : août 2003
Messages : 49
Détails du profil
Informations forums :
Inscription : août 2003
Messages : 49
Points : 50
Points : 50
Bonjour,

Comme je suis pas un pro en sql et qu'il faut le travailler, je me suis dit voilà un bon challenge...

J'ai supprimé les id pour les prérequis des bâtiments car je vois pas à quoi ça peu servir.
La base que j'ai utilisé:
Code SQL :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
-- phpMyAdmin SQL Dump
-- version 2.9.1.1
-- http://www.phpmyadmin.net
-- 
-- Serveur: localhost
-- Généré le : Jeudi 12 Juillet 2007 à 01:37
-- Version du serveur: 5.0.27
-- Version de PHP: 5.2.0
-- 
-- Base de données: `test`
-- 
 
-- --------------------------------------------------------
 
-- 
-- Structure de la table `batiments`
-- 
 
CREATE TABLE `batiments` (
  `id_batiment` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `nom_batiment` varchar(40) NOT NULL,
  UNIQUE KEY `nom_batiment` (`nom_batiment`),
  KEY `id` (`id_batiment`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ;
 
-- 
-- Contenu de la table `batiments`
-- 
 
INSERT INTO `batiments` (`id_batiment`, `nom_batiment`) VALUES 
(1, 'bat1'),
(2, 'bat2'),
(3, 'bat3'),
(4, 'bat4'),
(5, 'bat5'),
(6, 'bat6'),
(7, 'bat7'),
(8, 'bat8'),
(9, 'bat9'),
(10, 'bat10');
 
-- --------------------------------------------------------
 
-- 
-- Structure de la table `batiments_requis`
-- 
 
CREATE TABLE `batiments_requis` (
  `id_batiment` int(11) UNSIGNED NOT NULL,
  `id_batiment_requis` int(11) UNSIGNED NOT NULL,
  KEY `id_batiment` (`id_batiment`,`id_batiment_requis`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
 
-- 
-- Contenu de la table `batiments_requis`
-- 
 
INSERT INTO `batiments_requis` (`id_batiment`, `id_batiment_requis`) VALUES 
(5, 2),
(5, 4);
 
-- --------------------------------------------------------
 
-- 
-- Structure de la table `technologies`
-- 
 
CREATE TABLE `technologies` (
  `id_technologie` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `nom_technologie` varchar(40) NOT NULL,
  UNIQUE KEY `nom` (`nom_technologie`),
  KEY `id_technologie` (`id_technologie`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ;
 
-- 
-- Contenu de la table `technologies`
-- 
 
INSERT INTO `technologies` (`id_technologie`, `nom_technologie`) VALUES 
(1, 'tech1'),
(2, 'tech2'),
(3, 'tech3'),
(4, 'tech4'),
(5, 'tech5'),
(6, 'tech6'),
(7, 'tech7'),
(8, 'tech8'),
(9, 'tech9'),
(10, 'tech10');
 
-- --------------------------------------------------------
 
-- 
-- Structure de la table `technologies_requises`
-- 
 
CREATE TABLE `technologies_requises` (
  `id_batiment` int(11) UNSIGNED NOT NULL,
  `id_technologie_requise` int(11) UNSIGNED NOT NULL,
  KEY `id_technologie` (`id_batiment`,`id_technologie_requise`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
 
-- 
-- Contenu de la table `technologies_requises`
-- 
 
INSERT INTO `technologies_requises` (`id_batiment`, `id_technologie_requise`) VALUES 
(5, 9);
voilà la requete qui permet d'avoir les nom des batiments et des techno necessaire pour le batiment 5 (j'ai utiliser ton exemple et la techno 9)
Code SQL :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT `nom_batiment`
FROM batiments
WHERE `id_batiment` IN (
  SELECT `id_batiment_requis`
  FROM batiments_requis
  WHERE `id_batiment` = 5 )

UNION

SELECT `nom_technologie` 
FROM technologies
WHERE `id_technologie` IN (
  SELECT `id_technologie_requise`
  FROM technologies_requises
  WHERE `id_batiment` = 5 )
Résultat:
Citation:
nom_batiment
bat2
bat4
tech9
Pour le nom du batiment dont tu souhaite connaitre les prérequis, je pense que ce serait mieux a part...
Snowboarder69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/07/2007, 10h15   #5
Futur Membre du Club
 
Inscription : mars 2006
Messages : 106
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 106
Points : 18
Points : 18
Salut,

merci d'avoir pris de ton temps pour m'aider

En fait je me suis mal exprimé. Ce n'est pas tout à fait ce que j'aimerai faire. Je m'explique mieux : il y a une liste de bâtiments (comme tu as fait) qui ont chacun 0, 1 ou plusieurs pré requis (bâtiment ou technologiques). Jusque là ok. Mais ce que je voudrais faire c'est afficher une liste de tous les bâtiments avec leurs pré requis. C'est pour ça qu'à mon avis l'UNION ne peut pas être utilisé ici (je pense, c'est la 1ère fois que je m'en sert). Parce que sinon, comment distinguer quels sont les pré requis de quel bâtiment ?!
TheDoci est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2007, 10h12   #6
Futur Membre du Club
 
Inscription : mars 2006
Messages : 106
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 106
Points : 18
Points : 18
Petit up svp, je vois toujours pas comment faire
TheDoci est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2007, 11h52   #7
Membre éclairé
 
Avatar de jota5450
 
Jota Alves
Inscription : janvier 2006
Messages : 263
Détails du profil
Informations personnelles :
Nom : Jota Alves
Âge : 36

Informations forums :
Inscription : janvier 2006
Messages : 263
Points : 303
Points : 303
slt.

la Requete suivante te permet de voir tous tes batiments, de savoirs les batiments requis et les technologies requises. Elle te permet aussi le cas, ou ta seulement des batiments requis ou le cas ou tas seulements des techonologies requises. ( un batiment de niveau 2, qui a seulement des technologies requises, mais pas de batiment requis..)


pour les perfs... a toi de voir ....


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
 
SELECT br.id_batiment,br.id_batiment_requis,nom_batiment,
            tr.id_technologie_requise,t.nom_technologie
FROM batiments_requis br
LEFT JOIN batiments b ON br.id_batiment_requis=b.id_batiment
LEFT JOIN technologies_requises tr ON tr.id_batiment=br.id_batiment
LEFT JOIN technologies t ON tr.id_technologie_requise=t.id_technologie
 
union
 
SELECT b.id_batiment,NULL,NULL,tr.id_technologie_requise,t.nom_technologie
FROM batiments b
LEFT JOIN  technologies_requises tr ON tr.id_batiment=b.id_batiment
LEFT JOIN  technologies t ON t.id_technologie=tr.id_technologie_requise
 
WHERE b.id_batiment NOT IN
   (SELECT br.id_batiment FROM batiments_requis br)
ORDER BY 1
jota5450 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2007, 15h22   #8
Futur Membre du Club
 
Inscription : mars 2006
Messages : 106
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 106
Points : 18
Points : 18
Waw ! Ca c'est de la requête compliquée

Merci beaucoup, je vais essayer de la comprendre maintenant
TheDoci est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2007, 15h27   #9
Membre éclairé
 
Avatar de jota5450
 
Jota Alves
Inscription : janvier 2006
Messages : 263
Détails du profil
Informations personnelles :
Nom : Jota Alves
Âge : 36

Informations forums :
Inscription : janvier 2006
Messages : 263
Points : 303
Points : 303
slt...


elle fais exactement ce que tu voulais?
jota5450 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2007, 16h44   #10
Futur Membre du Club
 
Inscription : mars 2006
Messages : 106
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 106
Points : 18
Points : 18
oui quasiment. En fait il manque l'affichage du nom des bâtiments qu'on liste. Je suis en train d'essayer mais pour l'instant je galère^^
TheDoci est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h48.


 
 
 
 
Partenaires

Hébergement Web