Page 1 sur 1
Requete SQL sur sois même
Posté : 16 juin 2006, 14:23
par loopkin
Bonjour,
une requete que ej n'arrives aps a mettre en place :
une table ville
champs : id_ville, nom, code_agglo
code_agglo est égal à id_ville de l'agglo a laquelle appartient une ville.
Le but est d'obtenir, connaissant l'id_ville d'une ville la liste de toutes les villes appartenant a la même agglo.
Le résultat devrias avoir l'aspect suivant :
nom(ville), nom(agglo)
(bien sur nom agglo est le même sur chaque ligne vue la requete).
Je suis en MySQL 4.
Quelqu'un a une piste ?
Merci
Posté : 16 juin 2006, 14:34
par guilt92
code_agglo est égal à id_ville de l'agglo a laquelle appartient une ville.
Désolé je comprend pas. Tu as une table agglo qui associe le nom de l agglomeration a son code_agglo ? Essaye d etre un peu plus précis stp en tout cas moi j ai pas compris

Posté : 16 juin 2006, 14:40
par ouckileou
Ben ça a l'air simple :
Après pour récupérer à chaque fois le nom de l'algo faudrait compliquer la chose mais est-ce réellement utile ?
Un petit test à la sortie pour voir à quelle ligne id_ville = code_agglo et tu l'auras
Posté : 16 juin 2006, 14:46
par loopkin
Essaye d etre un peu plus précis stp en tout cas moi j ai pas compris

j'ai une seule table qui contient le code de chaque ville. Une ville peut appartenir a une agglomération, dans ce cas cette ville a un code agglo qui représente le code ville de la ville principale de l'agglomération.
id_ville, nom, code_agglo
1 villeA 3
2 villeB 3
3 villeC 3
4 villeD 6
L'affichage que je souhaite connaissant l'id_ville=2 est :
nom ville, nom agglo
villeA villeC
villeB villeC
villeC villeC
est ce que j'ai été plus claire ?
Merci
Posté : 16 juin 2006, 14:48
par loopkin
Après pour récupérer à chaque fois le nom de l'algo faudrait compliquer la chose mais est-ce réellement utile ?
Malheureusement oui, c'est utile, car là j'ai simplifié au maximum, d'autres colonnes sont a traitées.
Merci quand même.
Posté : 16 juin 2006, 14:53
par guilt92
tu dois absolument faire cela en 1 seule requete ? parce que en plus en MySQL 4 on ne peut pas faire de requetes imbriquées il me semble.
Posté : 16 juin 2006, 15:05
par ouckileou
c'est 4.1 les sous requêtes
Posté : 16 juin 2006, 15:15
par guilt92
ah ok désolé, ceci dit je verrai quand meme 2 requetes
1/ Récupérer le nom de l agglo :
Code : Tout sélectionner
SELECT nom FROM ville WHERE id=(SELECT code_agglo FROM ville WHERE id=$id)
2/ Récupérer toutes les villes
Code : Tout sélectionner
SELECT nom FROM ville WHERE code_agglo=(SELECT code_agglo FROM ville WHERE id=$id)
Ceci dit je suis fatigué y a peut etre plus simple

Posté : 16 juin 2006, 15:21
par ouckileou
La remarque est pas idiote puisqu'on ne sait pas exactement quelle version est utilisée
ah ok désolé, ceci dit je verrai quand meme 2 requetes
1/ Récupérer le nom de l agglo :
Code : Tout sélectionner
SELECT nom FROM ville WHERE id=(SELECT code_agglo FROM ville WHERE id=$id)
Ceci dit je suis fatigué y a peut etre plus simple

Pour celle-ci oui en effet :
Code : Tout sélectionner
SELECT id_ville, nom_ville AS nom_agglo
FROM villes
WHERE code_agglo = id_ville AND id_ville = 1
Posté : 16 juin 2006, 15:33
par loopkin
Merci pour ces pistes. Je vais vois si il y a moyen de passer en v4.1 ou v5 car ça semble dans ce cas nettement simplifier la vie.
Merci
Posté : 16 juin 2006, 16:18
par Henri
Cas hyper-classique : Il faut jouer avec les alias de tables pour pouvoir mettre deux fois la table ville dans la clause FROM. On appelera la table ville une fois v (pour ville) et une fois a (pour agglo) et on travaille comme si on avait deux tables distinctes v et a et une jointure entre ces deux "tables".
Ensuite, il faut également renommer les colonnes dans le select pour éviter d'avoir deux fois le même identifiant.
Code : Tout sélectionner
SELECT
v.id_ville AS id_ville, v.nom AS nom_ville,
a.id_ville AS id_agglo, a.nom AS nom_agglo
FROM ville AS v, ville AS a
WHERE v.code_agglo = a.id_ville
Posté : 16 juin 2006, 16:28
par ouckileou
Ah oui bien vu =D>
Posté : 16 juin 2006, 16:34
par Henri
Merci
15 ans de SQL derrière soi, même appris sur le tas, ça aide

Posté : 18 juin 2006, 15:51
par loopkin
Cas hyper-classique : Il faut jouer (...) le même identifiant.
Nickel Henri, merci beaucoup