8722 sujets

Développement web côté serveur, CMS

Bonjour à tous,

En simplifiant, j'ai une table des villes françaises nommée Smiley communes avec 2 champs Smiley nom et Smiley codepostal .

La problématique :
1) cette table contient dans les 50000 enregistrements, c'est beaucoup plus que les quelque 36681 communes recensées à ce jour mais c'est normal, vu que cette table contient aussi les cedex (ça, je zappe et je gère !) mais aussi et surtout les grandes villes qui possèdent plusieurs codes postaux, comme par exemple Metz qui est associée à trois codes postaux : 57000, 57050, 57070 - et c'est ça qui m'intéresse !)
2) donc, je ne veux extraire QUE la liste de ces communes qui apparaissent plusieurs fois dans la table mais avec des codes postaux différents

Je ne peux pas faire de requête de recherche de doublons du genre
SELECT COUNT(nom), nom FROM communes GROUP BY nom HAVING COUNT(nom) >1


...vu que cette requête va grouper par nom de ville, sans me donner la liste que je veux

Un exemple concret (avec des données fictives, c'est juste pour l'exemple Smiley cligne ) :

Donc, à partir de ma table Smiley communes qui contiendrait ces données :


<table>
<tr><td>nom</td><td>codepostal</td></tr>
<tr><td>Belleville</td><td>80200</td></tr>
<tr><td>St-Truc des Machin</td><td>85210</td></tr>
<tr><td>St-Machin</td><td>56110</td></tr>
<tr><td>GrandeVille</td><td>66510</td></tr>
<tr><td>GrandeVille</td><td>66520</td></tr>
<tr><td>GrandeVille</td><td>66570</td></tr>
<tr><td>GrandeVille</td><td>66590</td></tr>
<tr><td>GrandeVille</td><td>66510</td></tr>
<tr><td>PetitVillage</td><td>15240</td></tr>
<tr><td>Truc sur Bidule</td><td>04520</td></tr>
<tr><td>Bidule en Machin</td><td>18720</td></tr>
<tr><td>GrandeMetropole</td><td>91020</td></tr>
<tr><td>GrandeMetropole</td><td>91050</td></tr>
<tr><td>GrandeMetropole</td><td>91080</td></tr>
<tr><td>St-Village des Developpeurs</td><td>84250</td></tr>
<tr><td>St-Mysql-en-Problèmes</td><td>76200</td></tr>
</table>


... Je ne veux extraire que cette liste :


<table>
<tr><td>nom</td><td>codepostal</td></tr>
<tr><td>GrandeVille</td><td>66510</td></tr>
<tr><td>GrandeVille</td><td>66520</td></tr>
<tr><td>GrandeVille</td><td>66570</td></tr>
<tr><td>GrandeVille</td><td>66590</td></tr>
<tr><td>GrandeVille</td><td>66510</td></tr>
<tr><td>GrandeMetropole</td><td>91020</td></tr>
<tr><td>GrandeMetropole</td><td>91050</td></tr>
<tr><td>GrandeMetropole</td><td>91080</td></tr>
</table>


J'espère que ces explications auront été assez claires... Mais moi je sèche !!!

Vu les données dont je dispose, ma requête ne peut se baser que sur 2 critères : un nom de ville en commun et une racine de code postal (donc le N° de département) en commun. Avec ça c'est déjà pas mal débroussaillé !

Grand merci à vous qui pourrez éclairer ma lanterne
@+
ET si tu essayais quelque chose dans ce goût-là ? ON reprend ton idée mais on l'améliore :


select nom, group_concat(code) as codes, count(*) as nb
from codes_postaux
group by nom
having nb>=2


Ca te retournerait quelque chose comme :
nom | codes | nb
Ville1 | 1234,2345,3456 | 3
Ville2 | 4567,5678 | 2
Ville3 | 6789,7890,8901,9012 | 4
Merci beaucoup QuentinC !

J'ai seulement dû modifier le format de ma colonne "codes" car les enregistrements renvoyés produisaient trop de caractères, du coup ils contenaient, au lieu des codes postaux séparés par des virgules, une information en octet du genre [BLOB-20 octets]

Voilà donc la requête finale pour ceux que ça intéresserait :

select nom, GROUP_CONCAT(CONVERT(codepostal, CHAR(8))) as codes, count(*) as nb
from communes
group by nom
having nb>=2


Et en excluant tous les enregistrements dont le nom contient "CEDEX", j'arrive à extraire seulement 1 bonne centaine de communes qui avaient réellement des doublons... sur 50000 enregistrements au départ, je dis que c'est pas mal du tout !!! Une petite intervention humaine pour une vérification manuelle finale, devrait donc me permettre de récupérer toutes ces grandes communes qui possèdent plusieurs codes postaux.
Encore merci Smiley biggrin