Requetes sur plusieures tables
Bonjour à tous,
je suis débutant en Mysql. J essaye (à titre d'exercice) de faire un site d'agence immobilière. J'ai donc créé une base de données comportant les tables suivantes : biens, type_biens(=Maison, appartement, studio), statut_bien (=a vendre, vendu, a louer, loué), link_statut(permettant de faire la liaison entre biens et statut_bien) et communes.
Je souhaites afficher toutes les maisons à vendre et afficher la commune correspondante. J'arrive sans problème à afficher les maisons à vendre mais lorsque je lui demande d'afficher également la commune correspondant au bien, pour tous les biens, il m'affiche toutes les communes. Pour faire plus simple, si j'ai 4 biens de 4 communes différentes, au lieu de m'afficher les 4 biens avec leur commune respective, il m'affiche 4 X 4 soit 16 biens.
J'ai essayé avec des sous-requêtes, avec une table temporaire (càd mettre le résultat dans une table et pour chaque élément de cette table afficher la commune) mais ça ne marche pas.
Quelqu'un aurait une idée?
Voici ci-dessous la construction de ma base de données.
Merci de m'avoir lu et d'avance merci à tous ceux qui m'apporteront leur aide.
DROP TABLE IF EXISTS `biens`; CREATE TABLE `biens` ( `id_biens` int(11) NOT NULL AUTO_INCREMENT, `adresse` varchar(250) NOT NULL, `pays` varchar(70) NOT NULL DEFAULT 'Belgique', `prix` mediumint(25) NOT NULL, `description` text NOT NULL, `code_bien` char(11) NOT NULL, PRIMARY KEY (`id_biens`)) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=latin1; LOCK TABLES `biens` WRITE;/*!40000 ALTER TABLE `biens` DISABLE KEYS */;INSERT INTO `biens` (`id_biens`,`adresse`,`pays`,`prix`,`description`,`code_bien`)VALUES (1,'Avenue du Parc','Belgique',213000,'Jolie Petite maison d\'habitation','10'), (2,'Rue des Sciences','Belgique',275000,'Splendide Villa 4 facades','20'), (3,'Avenue de la piscine','Belgique',543000,'Immeuble de rapport avec nombreux garages','10'), (4,'Chausse d\'Hacht','Belgique',123000,'Appartement 2 chambres','30'), (5,'Rue de la fontaine','Belgique',321000,'Maison à restaurer','30'); /*!40000 ALTER TABLE `biens` ENABLE KEYS */;UNLOCK TABLES; # Dump of table communes# ------------------------------------------------------------ DROP TABLE IF EXISTS `communes`; CREATE TABLE `communes` ( `id_commune` int(11) NOT NULL AUTO_INCREMENT, `code_postal` mediumint(5) NOT NULL, `ville` varchar(75) NOT NULL, `commune` varchar(75) NOT NULL, `langue` varchar(2) NOT NULL, PRIMARY KEY (`id_commune`), KEY `code_postal` (`code_postal`), KEY `ville` (`ville`), KEY `commune` (`commune`)) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8; LOCK TABLES `communes` WRITE;/*!40000 ALTER TABLE `communes` DISABLE KEYS */;INSERT INTO `communes` (`id_commune`,`code_postal`,`ville`,`commune`,`langue`)VALUES (1,1000,'Bruxelles','Bruxelles','FN'), (2,1000,'Bruxelles','Laeken (Bru.)','FN'), (3,1000,'Bruxelles','Neder-over-Heembeek (Bru.)','FN'), (4,1000,'Bruxelles','Haren (Bru.)','FN'), (5,1030,'Bruxelles','Schaerbeek','FN'), (6,1040,'Bruxelles','Etterbeek','FN'), (7,1050,'Bruxelles','Ixelles','FN'), (8,1060,'Bruxelles','Saint-Gilles','FN'), (9,1070,'Bruxelles','Anderlecht','FN'), (10,1080,'Bruxelles','Molenbeek-Saint-Jean','FN'), (11,1081,'Bruxelles','Koekelberg','FN'), (12,1082,'Bruxelles','Berchem-Sainte-Agathe','FN'), (13,1083,'Bruxelles','Ganshoren','FN'), (14,1090,'Bruxelles\n','Jette','FN'), (15,1140,'Bruxelles','Evere','FN'), (16,1150,'Bruxelles','Woluwe-Saint-Pierre','FN'), (17,1160,'Bruxelles','Auderghem','FN'), (18,1170,'Bruxelles','Watermael-Boitsfort','FN'), (19,1180,'Bruxelles','Uccle','FN'), (20,1190,'Bruxelles','Forest','FN'), (21,1200,'Bruxelles','Woluwe-Saint-Lambert','FN'), (22,1210,'Bruxelles','Saint-Josse-ten-Noode','FN'); /*!40000 ALTER TABLE `communes` ENABLE KEYS */;UNLOCK TABLES; # Dump of table link_communes# ------------------------------------------------------------ DROP TABLE IF EXISTS `link_communes`; CREATE TABLE `link_communes` ( `id_biens` int(11) NOT NULL, `code_postal` mediumint(5) NOT NULL) ENGINE=MyISAM DEFAULT CHARSET=latin1; LOCK TABLES `link_communes` WRITE;/*!40000 ALTER TABLE `link_communes` DISABLE KEYS */;INSERT INTO `link_communes` (`id_biens`,`code_postal`)VALUES (1,5), (2,6), (3,1), (4,5), (5,1); /*!40000 ALTER TABLE `link_communes` ENABLE KEYS */;UNLOCK TABLES; # Dump of table link_statut# ------------------------------------------------------------ DROP TABLE IF EXISTS `link_statut`; CREATE TABLE `link_statut` ( `id_biens` mediumint(11) NOT NULL, `code_statut` char(5) NOT NULL) ENGINE=MyISAM DEFAULT CHARSET=latin1; LOCK TABLES `link_statut` WRITE;/*!40000 ALTER TABLE `link_statut` DISABLE KEYS */;INSERT INTO `link_statut` (`id_biens`,`code_statut`)VALUES (1,'10'), (2,'20'), (3,'10'), (4,'30'), (5,'10'); /*!40000 ALTER TABLE `link_statut` ENABLE KEYS */;UNLOCK TABLES; # Dump of table statut_bien# ------------------------------------------------------------ DROP TABLE IF EXISTS `statut_bien`; CREATE TABLE `statut_bien` ( `id_statut` int(11) NOT NULL AUTO_INCREMENT, `code_statut` char(5) NOT NULL, `statut_bien` varchar(50) NOT NULL, PRIMARY KEY (`id_statut`)) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=latin1; LOCK TABLES `statut_bien` WRITE;/*!40000 ALTER TABLE `statut_bien` DISABLE KEYS */;INSERT INTO `statut_bien` (`id_statut`,`code_statut`,`statut_bien`)VALUES (1,'10','a vendre'), (2,'15','vendu'), (3,'20','a louer'), (4,'25','loue'); /*!40000 ALTER TABLE `statut_bien` ENABLE KEYS */;UNLOCK TABLES; # Dump of table type_biens# ------------------------------------------------------------ DROP TABLE IF EXISTS `type_biens`; CREATE TABLE `type_biens` ( `id_type_biens` int(11) NOT NULL AUTO_INCREMENT, `code_bien` char(11) NOT NULL, `type_bien` varchar(50) NOT NULL, PRIMARY KEY (`id_type_biens`)) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=latin1; LOCK TABLES `type_biens` WRITE;/*!40000 ALTER TABLE `type_biens` DISABLE KEYS */;INSERT INTO `type_biens` (`id_type_biens`,`code_bien`,`type_bien`)VALUES (1,'10','Maison'), (2,'20','Appartement'), (3,'30','Studio'), (4,'40','Magasin'), (5,'50','Bureau'); /*!40000 ALTER TABLE `type_biens` ENABLE KEYS */;UNLOCK TABLES;
Réponses apportées à cette discussion
Salut,
tu peux simplifier certains éléments, ça va grandement te faciliter la vie.
D'abord, il existe avec MySQL un type de champ fort pratique : ENUM. Ce type de champ permet de stocker plusieurs valeurs possibles pour une ligne et en général on définit une des valeurs par défaut. Ainsi, pour les valeurs "maison", "Appartement", etc.., tu peux créer dans ta table « biens » une colonne type_bien de type ENUM en écrivant dans ta requête de création :
CREATE TABLE `biens` (
`id_biens` int(11) NOT NULL AUTO_INCREMENT,
`adresse` varchar(250) NOT NULL,
`pays` varchar(70) NOT NULL DEFAULT 'Belgique',
`prix` mediumint(25) NOT NULL,
`description` text NOT NULL,
`code_bien` char(11) NOT NULL,
`type_bien` ENUM('Maison','Appartement','Studio','Magasin','Bureau') NOT NULL DEFAULT 'Maison',
PRIMARY KEY (`id_biens`)
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=latin1;
Fais pareil pour le statut du bien.
Pour la commune maintenant, il te faut ajouter dans la table « bien » une clé étrangère correspondant à la clé primaire de la commune. Comme ça, en récupérant la ligne du bien, tu disposeras de la clé de la commune où est situé ce bien. Partant de là, tu pourras faire une simple jointure du genre :
SELECT
b.id_biens,
b.adresse,
c.code_postal,
c.ville,
c.commune,
c.langue,
b.type_bien,
b.statut_bien
FROM biens b
JOIN commune c ON b.id_commune = c.id_commune
WHERE b.id_bien = «identifiant de la ligne recherchée»;
Et là tu auras toutes les informations voulues.
Hello Cyrano,
merci pour ta réponse.
ce que tu proposes est effectivement une bonne solution, mais la table type_biens me sert également pour générer mon menu. Est-ce que au départ d'un champ ENUM, il possible de s'en servir pour générer le contenu d'un menu?
Tiens, pour ça, j'ai une réponse ici.J'avais posté ça il y a pas mal de temps mais c'Est toujours valable ;)
Parfait merci Cyrano