Page 1 sur 1

requête retournant la liste des pays

Posté : 15 avr. 2011, 14:50
par sam01
Bonjour à tous,

j'ai la requête suivante qui fonctionne bien et qui me donne la liste des adhérents inscrits ( A.valide = 2) :

Code : Tout sélectionner

$sql_dest = sprintf("SELECT A.id_adh, A.id_vil, A.date_ins, B.id_vil, B.id_pay, B.ville_fr, C.id_pay, C.id_con, C.pays_".$lang.", D.cont_".$lang." FROM flatforswap_adherent A INNER JOIN flatforswap_ville B ON A.id_vil = B.id_vil INNER JOIN flatforswap_pays C ON B.id_pay = C.id_pay INNER JOIN flatforswap_continent D ON D.id_con = C.id_con WHERE A.valide ='2')");}
Cett fois-ci j'aimerais avoir la liste UNIQUE du couple continent/pays des adherents inscrits.

J'ai tenté la requête suivante :

Code : Tout sélectionner

$sql_dest = sprintf("SELECT DISTINCT A.id_pay, A.pays_".$lang.", A.id_con, B.id_vil, B.id_pay, B.ville_fr, D.cont_".$lang.", E.id_vil FROM flatforswap_pays A INNER JOIN flatforswap_ville B ON A.id_pay = B.id_pay INNER JOIN flatforswap_continent D ON D.id_con = A.id_con INNER JOIN flatforswap_adherent E ON E.id_vil = B.id_vil WHERE E.valide ='2'");
J'ai une liste avec plein de doublons... j'ai une vingtaine de fois le pays france et une fois le pays canada, et je ne vois pas apparaître pays-bas, Malaisie (alors que ce sont des pays qui devraient apparaître...)

J'ai l'impression que le DISTINCT ne fonctionne pas...

Pour info voci la structure de mes tables :

Code : Tout sélectionner

-- -- Structure de la table `flatforswap_ville` -- CREATE TABLE `flatforswap_ville` ( `id_vil` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, `id_pay` int(10) UNSIGNED NOT NULL DEFAULT '0', `ville_fr` varchar(255) NOT NULL DEFAULT '', PRIMARY KEY (`id_vil`), KEY `id_pay` (`id_pay`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 PACK_KEYS=0 COMMENT='table ville du site FLATFORSWAP' AUTO_INCREMENT=1 ; -- CREATE TABLE `flatforswap_pays` ( `id_pay` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, `id_con` int(10) UNSIGNED NOT NULL DEFAULT '0', `code` char(2) NOT NULL DEFAULT '', `pays_fr` varchar(255) NOT NULL DEFAULT '', `pays_en` varchar(255) DEFAULT NULL, `pays_es` varchar(255) NOT NULL DEFAULT '', PRIMARY KEY (`id_pay`), KEY `id_con` (`id_con`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 PACK_KEYS=0 COMMENT='table pays du site FLATFORSWAP' AUTO_INCREMENT=239 ; CREATE TABLE `flatforswap_continent` ( `id_con` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, `cont_fr` varchar(255) NOT NULL DEFAULT '', `cont_en` varchar(255) NOT NULL DEFAULT '', `cont_es` varchar(255) NOT NULL DEFAULT '', PRIMARY KEY (`id_con`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 PACK_KEYS=0 COMMENT='table continent du site FLATFORSWAP' AUTO_INCREMENT=9 ; -- CREATE TABLE `flatforswap_adherent` ( `id_adh` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, `id_vil` int(10) UNSIGNED NOT NULL DEFAULT '0', `id_fac` int(11) NOT NULL DEFAULT '0', `mail` varchar(128) NOT NULL DEFAULT '', `nom` text NOT NULL, `prenom` text NOT NULL, `mdp` varchar(128) NOT NULL DEFAULT '', `ad_ligne1` varchar(128) NOT NULL DEFAULT '', `ad_ligne2` varchar(128) NOT NULL DEFAULT '', `ad_cp` varchar(125) NOT NULL DEFAULT '', `civilite` text NOT NULL, `telephone` varchar(125) NOT NULL DEFAULT '', `ad_ip` varchar(50) DEFAULT NULL, `mp` enum('a','d') NOT NULL DEFAULT 'a', `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `anglais` enum('0','1') NOT NULL DEFAULT '0', `français` enum('0','1') NOT NULL DEFAULT '0', `espagnol` enum('0','1') NOT NULL DEFAULT '0', `autres` varchar(125) NOT NULL DEFAULT '', `date_ins` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `valide` enum('0','1','2','3') NOT NULL DEFAULT '0', `lat` float(10,6) NOT NULL DEFAULT '0.000000', `lng` float(10,6) NOT NULL DEFAULT '0.000000', `type` varchar(30) NOT NULL DEFAULT '', PRIMARY KEY (`id_adh`), UNIQUE KEY `mail_2` (`mail`), KEY `mail` (`mail`), KEY `id_vil` (`id_vil`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 PACK_KEYS=0 COMMENT='table adherent du site FLATFORSWAP' AUTO_INCREMENT=1 ;

Merci d'avance pour votre aide.

Re: requête retournant la liste des pays

Posté : 15 avr. 2011, 15:34
par aokle
Salut.

Je pense que tu pourrais utiliser un group by pour cette requête, un peu dans ce style :
select pays.nomfrancais_pays, continent.nomfrancais_continent
from ville, pays, continent
where pays.id_continent = continent.id_continent
and ville.id_pays = pays.id_pays
and ville.id_ville in (select id_ville from adherent)
group by pays.nom_pays, continent.nom_continent
Mes excuses par avance, la requête a été tapée à main levée, je n'ai pas respecté les noms de tes colonnes.

Bonne continuation.

Re: requête retournant la liste des pays

Posté : 15 avr. 2011, 15:52
par sam01
Ok,

Apparemment je n'ai pas besoin d'utiliser de "INNER JOIN" d'après ton exemple ?

Re: requête retournant la liste des pays

Posté : 15 avr. 2011, 16:04
par aokle
Si, si, tu peux tout à fait utiliser INNER JOIN.
SELECT *
FROM t1
INNER JOIN t2 ON t1.id = t2.id_t1
est équivalent à
SELECT *
FROM t1, t2
WHERE t1.id = t2.id_t1
C'est juste une habitude personnelle d'utiliser des jointures classiques.

A+

Re: requête retournant la liste des pays

Posté : 15 avr. 2011, 18:47
par sam01
J'ai essayé de traduire ta requête avec mes structures de tables et j'ai obtenu :

	$sql_dest = sprintf("SELECT A.pays_".$lang.", D.continent_".$lang."
			FROM flatforswap_pays A
			INNER JOIN flatforswap_continent B ON B.id_con = A.id_con
			INNER JOIN flatforswap_ville B ON A.id_pay = B.id_pay
			AND B.id_vil IN (SELECT id_vil FROM flatforswap_adherent)
			GROUP BY A.pays_".$lang.", D.cont_".$lang."
			WHERE E.valide ='2'");

mais j'ai obtenu l'erreur suivante :

Code : Tout sélectionner

Erreur SQL ! SELECT A.pays_fr, D.continent_fr FROM flatforswap_pays A INNER JOIN flatforswap_continent B ON B.id_con = A.id_con INNER JOIN flatforswap_ville B ON A.id_pay = B.id_pay AND B.id_vil IN (SELECT id_vil FROM flatforswap_adherent) GROUP BY A.pays_fr, D.cont_fr WHERE E.valide ='2' Not unique table/alias: 'B'
Saurais-tu d'où ça vient ?

Re: requête retournant la liste des pays

Posté : 18 avr. 2011, 09:52
par macgawel
mais j'ai obtenu l'erreur suivante :

Code : Tout sélectionner

Erreur SQL ! SELECT A.pays_fr, D.continent_fr FROM flatforswap_pays A INNER JOIN flatforswap_continent B ON B.id_con = A.id_con INNER JOIN flatforswap_ville B ON A.id_pay = B.id_pay AND B.id_vil IN (SELECT id_vil FROM flatforswap_adherent) GROUP BY A.pays_fr, D.cont_fr WHERE E.valide ='2' Not unique table/alias: 'B'
Saurais-tu d'où ça vient ?
Not unique table/alias: 'B'
Alias ou table non unique : 'B'
tu utilises deux fois (ou plus) l'alias ou le nom de table 'B'.

Un indice :
                        INNER JOIN flatforswap_continent B ON B.id_con = A.id_con
                        INNER JOIN flatforswap_ville B ON A.id_pay = B.id_pay