Contraire de "SELECT DISTINCT" en SQL

WRInaute discret
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...
 
WRInaute discret
Essaie cela, je ne suis pas sûr de la requête car je n'ai pas le shéma de ta table:

Code:
SELECT NomVille, SUM(habitants) nombre FROM villes WHERE nombre = Commune GROUP BY NomVille
 
WRInaute discret
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
 
WRInaute accro
FINIELS a dit:
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:
SELECT * from villes WHERE (Commune,NombreHabitants) IN (SELECT Commune,NombreHabitants FROM villes GROUP BY 1,2 HAVING count(*)>1)

Jacques.
 
WRInaute passionné
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)
 
WRInaute discret
Une autre voie:

Code:
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:
 
WRInaute discret
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:
$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 />';
}
 
Discussions similaires
Haut