Contraire de "SELECT DISTINCT" en SQL

FINIELS
WRInaute discret
WRInaute discret
 
Messages: 96
Inscription: 24 Mai 2004

Contraire de "SELECT DISTINCT" en SQL

Message le Jeu Mar 20, 2008 17:51

Salut tout le monde,

j'aurais besoin d'un peu d'aide parce que là je pédale dans la semoule...

Je souhaiterais sélectionner toutes les lignes d'une table ou la commune et le nombre d'habitants sont identiques...

Cette fonction fonctionne :

SELECT *, count(*) FROM `villes` GROUP BY Commune,NombreHabitants HAVING count(*) > 1

Mais elle ne me sort qu'un seul enregistrement de la ligne en double. Et moi j'aurais besoin de tous les enregistrements dupliqués.

Si quelqu'un a une idée...Je suis preneur...


magicaxe
WRInaute discret
WRInaute discret
 
Messages: 151
Inscription: 18 Oct 2004

Message le Jeu Mar 20, 2008 18:07

Essaie cela, je ne suis pas sûr de la requête car je n'ai pas le shéma de ta table:

Code: Tout sélectionner
SELECT NomVille, SUM(habitants) nombre FROM villes WHERE nombre = Commune GROUP BY NomVille

FINIELS
WRInaute discret
WRInaute discret
 
Messages: 96
Inscription: 24 Mai 2004

Message le Jeu Mar 20, 2008 18:32

Ma table :

id || Commune || Codepos || NombreHabitants
1 || NIMES|| 30000 || 130000
2 || NIMES|| 30900|| 130000
3 || VIENNE|| 26000|| 12000
4 || MARSEILLE 1er arrdt || 13001|| 23000
5 || MARSEILLE 2er arrdt || 13002|| 25000
6 || MARSEILLE 3er arrdt || 13003|| 45000
7 || TOULOUSE || 81000|| 55000
8 || TOULOUSE || 81150|| 55000


Et je souhaite récupérer ça :
1 || NIMES|| 30000 || 130000
2 || NIMES|| 30900|| 130000
7 || TOULOUSE || 81000|| 55000
8 || TOULOUSE || 81150|| 55000

Grosso modo pour certaines villes, la ville est en double (seul le code postal différe) et je souhaiterais passer la population d'un des codes postaux à "0" pour ne pas fausser mes calculs de population.

je vais tester ta solution magicaxe

jcaron
WRInaute accro
WRInaute accro
 
Messages: 2678
Inscription: 13 Fév 2004

Re: Contraire de "SELECT DISTINCT" en SQL

Message le Jeu Mar 20, 2008 19:50

FINIELS a écrit:Je souhaiterais sélectionner toutes les lignes d'une table ou la commune et le nombre d'habitants sont identiques...

Cette fonction fonctionne :

SELECT *, count(*) FROM `villes` GROUP BY Commune,NombreHabitants HAVING count(*) > 1

Mais elle ne me sort qu'un seul enregistrement de la ligne en double. Et moi j'aurais besoin de tous les enregistrements dupliqués.


Ben une fois que tu as la liste des doublons, il suffit de les afficher:

Code: Tout sélectionner
SELECT * from villes WHERE (Commune,NombreHabitants) IN (SELECT Commune,NombreHabitants FROM villes GROUP BY 1,2 HAVING count(*)>1)


Jacques.


arnaudmn
WRInaute passionné
WRInaute passionné
 
Messages: 1536
Inscription: 11 Mai 2005

Message le Jeu Mar 20, 2008 19:57

C'est pas plutot ça qu'il veut :

select * from villes X where exists(select id from villes Y where x.id<>y.id and x.commune=y.commune)


magicaxe
WRInaute discret
WRInaute discret
 
Messages: 151
Inscription: 18 Oct 2004

Message le Jeu Mar 20, 2008 21:50

Une autre voie:

Code: Tout sélectionner
SELECT v1.Commune, v1.CodePos, v1.NombreHabitant FROM villes v1 JOIN villes v2 ON v1.Commune = v2.Commune AND v1.CodePos != v2.CodePos AND v1.NombreHabitants = v2.NombreHabitant


Ca doit te donner le résultat recherché.

Je me base sur une jointure entre la table villes et elle-même si le nom de la commune est identique, si le nombre d'habitants est égal et si le code postale est différent. Toutes les communes n'ayant pas d'équivalent au niveau du nom ou du nombre d'habitants ne ressortiront pas.

Attention, cette reqête ne fera pas ressortir le résultat suivants:

1 || NIMES|| 30000 || 130000
2 || NIMES|| 30900|| 130000
7 || TOULOUSE || 81000|| 55000
8 || TOULOUSE || 81150|| 55000
n || TOULOUSE || 81xxx|| 12000

Une commune Toulouse avec un nombre d'habitant différent de 55'000

A+ :wink:

FINIELS
WRInaute discret
WRInaute discret
 
Messages: 96
Inscription: 24 Mai 2004

Message le Ven Mar 21, 2008 11:27

Merci à tous pour votre aide mais je me suis débrouillé !

Ok ok c'est pas super optimisé et je me suis fais chier mais je suis arrivé au résultat voulu :

Code: Tout sélectionner


$request = mysql_query("SELECT *, count(*) FROM `villes` GROUP BY Communeurl,NombreHabitants HAVING count(*) > 1");
while ($line = mysql_fetch_array($request)) {
   $commune = $line['Communeurl'];
   $cp = $line['Codepos'];
   $id = $line['id'];
   $hab = $line['NombreHabitants'];
   $Communeurl = $line['Communeurl'];
echo 'Ville 1 : '.$commune.' '.$cp.' '.$hab.' ID : '.$id.' <input type="checkbox" name="test'.$id1.'" id='.$id1.' /><br />';
   
$request2 = mysql_query("SELECT * FROM `villes` WHERE Communeurl= '$commune' AND NombreHabitants = '$hab' AND Codepos NOT LIKE '$cp' ");
$line2 = mysql_fetch_array($request2);
   $Commune2 = $line2['Communeurl'];
   $cp2 = $line2['Codepos'];
   $id2 = $line2['id'];
   $hab2 = $line2['NombreHabitants'];
echo 'Ville 2 : '.$Commune2.' '.$cp2.' '.$hab2.' ID : '.$id2.'<input type="checkbox" name="test'.$id2.'" id='.$id2.' /><br />';


echo '<br />';
}




magicaxe
WRInaute discret
WRInaute discret
 
Messages: 151
Inscription: 18 Oct 2004

Message le Ven Mar 21, 2008 22:51

Tu devrais essayer ma requête dans PhpMyAdmin par exemple :wink:


Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Lectures recommandées sur ce thème :

Consultez la description détaillée des produits ou services de Google suivants : Google TrustRank

  • Calcul du taux de liens vers des pages internes
    Cet outil vous permet de calculer le taux de liens profonds vers un site web. Un lien profond est un lien qui ne pointe pas vers la page d'accueil mais au contraire vers une page interne du site. Les sites dont l'essentiel du référencement vient de leurs inscriptions dans des annuaires ont un taux de liens profonds faible ; à l'inverse, les sites de référence ont souvent un taux de liens profonds plus important, signe que leur contenu a suscité de nombreux liens spontanés.


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités