Bonjour,
Je souhaiterai faire une requête, qui m'affiche une liste de lycées ou d'universités avec leurs adresses.
Exemple d'affichage :
Lycée Pasteur
Neuilly-sur-Seine, France
pour ça j'ai du crée quatre tables
trois tables pour l'adresse:
- location_country (pour les pays)
- location_region (pour les regions)
- location_location (pour les localités et autres ...)
La structure des trois tables
Code mySql : Sélectionner tout - Visualiser dans une fenêtre à part
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 -- `location_country` CREATE TABLE `location_country` ( `country_id` smallint(3) unsigned NOT NULL AUTO_INCREMENT, `country_en_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, `country_local_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (`country_id`), UNIQUE KEY `country_en_name` (`country_en_name`,`country_local_name`) ) -- `location_region` CREATE TABLE `location_region` ( `region_id` int(10) unsigned NOT NULL AUTO_INCREMENT, `region_country_id` smallint(3) unsigned NOT NULL, `region_post_code` varchar(15) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, `region_common_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, `region_local_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (`region_id`), KEY `region_country_id` (`region_country_id`,`region_common_name`,`region_local_name`), KEY `region_post_code` (`region_post_code`) ) -- `location_location` CREATE TABLE `location_location` ( `location_id` bigint(13) unsigned NOT NULL AUTO_INCREMENT, `location_country_id` smallint(3) unsigned NOT NULL, `location_region_id` int(10) unsigned NOT NULL, `location_post_code` varchar(15) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, `location_en_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, `location_local_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, PRIMARY KEY (`location_id`), KEY `location_country_id` (`location_country_id`,`location_region_id`,`location_en_name`,`location_local_name`), KEY `location_post_code` (`location_post_code`) )
Pour faire simple, chaque localisation et lier a une région qui est liera un pays.
'location_location' => 'location_region' => 'location_country'
grâce a ce forum et notamment au membre "sabotage" je suis sortie avec cette requête.
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 $sql = "SELECT * FROM location_country LEFT JOIN location_region ON region_country_id = country_id LEFT JOIN location_location location_region_id = region_id WHERE location_post_code LIKE '%$location%' || location_common_name LIKE '%$location%' || location_local_name LIKE '%$location%' || region_post_code LIKE '%$location%' || region_common_name LIKE '%$location%' || region_local_name LIKE '%$location%' || country_en_name LIKE '%$location%' || country_local_name LIKE '%$location%'";
Jusque la ça va je peut faire des recherche fulltext sur ces trois tables et avoir des résulta du genre:
location, region, country
paris, france
Nord-Pas de Calais, lille, france
Laval, Québec, Canada ...
Ce que je veux faire maintenant c'est lier ces trois table a une quatrième table qui contiens une liste de lycées
Code mySql : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 -- `high_school` CREATE TABLE `high_school` ( `h_s_id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, `h_s_name` varchar(200) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, `h_s_location_type` tinyint(1) unsigned NOT NULL, `h_s_location_id` int(11) unsigned NOT NULL, PRIMARY KEY (`h_s_id`), KEY `h_s_location_type` (`h_s_location_type`,`h_s_location_id`), FULLTEXT KEY `h_s_name` (`h_s_name`) )
cette table est relier avec les table de location, avec les champs 'h_s_location_type' et 'h_s_location_id'
'h_s_location_type' a trois valeur 1,2 et 3 ce qui définie si la localisation du lycée est enregistrer dans la table 'location_country' ou 'location_region' ou 'location_location', en gros si elle vaut 1 je chercher la valeur de 'h_s_location_id' dans la table 'location_country' si elle vaut 2 je chercher dans la table 'location_region' ...
de mon coté je n'est fait qu'ajouter 'high_school,' a la requête qui ma été donné précédemment avec quelque conditions coté "WHERE"
Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
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 $sql = "SELECT * FROM high_school, location_country LEFT JOIN location_region ON region_country_id = country_id LEFT JOIN location_location ON location_region_id = region_id WHERE h_s_name LIKE '%$h_s_name%' && ( ( h_s_location_type = 1 && country_id = h_s_location_id ) || ( h_s_location_type = 2 && region_id = h_s_location_id ) || ( h_s_location_type = 3 && location_id = h_s_location_id ) ) ORDER BY h_s_name && h_s_id LIMIT 0,8"
Cette requête marche très bien quand il s'agi du type 2 et 3 c'est-a-dire quand l'adresse du lycée ce trouve dans la table 'location_location' ou 'location_region', le problème est avec le type 1 (la table 'location_country')
la j'ai un résultat qui ce répète avec tous les pays que j'ai enregistrer dans la table 'location_country'
Je peut très bien faire deux requête la premier qui donne le type et l'id de la localisation, et la deuxième qui retourne la localisation__exemple d'affichage avec h_s_location_type 2 :
nom du Lycée
region, country
__ exemple d'affichage avec h_s_location_type 3 :
nom du Lycée
location, region, country
__ exemple d'affichage avec h_s_location_type 4 :
nom du Lycée
country
nom du Lycée
country
nom du Lycée
country
nom du Lycée
country
..... ça répète avec tous les pays dans la table 'location_country
quelque chose du genre
mais c'est vraiment lourd, pour 8 résultats il faut 9 requête SQL
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 $sql_type = array('','country_id','region_id','location_id'); $sql = "SELECT * FROM high_school WHERE h_s_name LIKE '%$h_s_name%'"; $query = mysql_query($sql); while($response = mysql_fetch_assoc($query)) { $h_s_location_type = $response['h_s_location_type']; $h_s_location_id = $response['h_s_location_id']; $sql2 = "SELECT * FROM location_country LEFT JOIN location_region ON region_country_id = country_id LEFT JOIN location_location ON location_region_id = region_id WHERE $sql_type[$h_s_location_type] = $h_s_location_id "; $query2 = mysql_query($sql2); .... }
le mieux serai encore une fois de résumé le tous en une seul requête, je suis presque sure qu'il manque un petit quelque chose, pour que ça marche.
Je revient sur ce forum car il ma été d'une grande utilité a mainte reprise, et la encore je me tourne vers vous pour demandé de l'aide merci.
Partager