Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/02/2012, 20h52   #1
Membre confirmé
 
Inscription : mars 2004
Messages : 1 187
Détails du profil
Informations forums :
Inscription : mars 2004
Messages : 1 187
Points : 233
Points : 233
Par défaut Lister cinq pays différents

Bonjour à tous,

j'ai la requête suivante qui me permet de lister cinq adhérents au hasard dans le monde

Code :
1
2
3
4
5
6
7
8
9
10
11
 
 
				$sqla = sprintf("SELECT a.id_adh
				FROM flatforswap_adherent AS a
				LEFT OUTER JOIN flatforswap_logement AS l ON l.id_adh = a.id_adh
				LEFT OUTER JOIN flatforswap_photo AS p ON p.id_log = l.id_log
				WHERE valide ='2'
				GROUP BY a.id_adh
				HAVING COUNT(*) > 1 
				ORDER BY RAND()
				LIMIT 5");
Et j'ai une deuxième requête qui permet de déterminer la localité de l'adhérent

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
 
		$sqlb = sprintf("select X.id_adh, X.id_vil, A.id_vil, A.id_pay, A.ville_fr, B.id_pay, B.id_con, B.pays_".$lang.", C.id_con, C.cont_".$lang." 
		FROM flatforswap_adherent X
		INNER JOIN flatforswap_ville A ON X.id_vil = A.id_vil
		INNER JOIN flatforswap_pays B ON A.id_pay = B.id_pay
		INNER JOIN flatforswap_continent C ON B.id_con = C.id_con
		WHERE X.id_adh=%s", quote_smart($id_adh));
		$reqb = mysql_query($sqlb) OR die('Erreur SQL !<br>'.$sqlb.'<br>'.mysql_error());
		$datab = mysql_fetch_assoc($reqb);
		$ville_adh = $datab['ville_fr'];
		$pays_adh = $datab['pays_'.$lang.''];
		$continent_adh = $datab['cont_'.$lang.''];
J'aimerais, si c'est possible dans ma première requête ajouter un restriction au niveau du pays de l'adhérent.

En l'état actuel, cette requête liste 5 adhérents au hasard. Ca signifie que je peux avoir deux adhérents habitants le même pays, et même plus.

Comment pourrais-je ajouter une clause afin que cette requête m'affiche cinq adhérents habitant chacun dans un pays différent.

Merci d'avance pour votre aide.
sam01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 10h16   #2
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 531
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

Informations professionnelles :
Activité : Retraité
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : novembre 2005
Messages : 2 531
Points : 3 524
Points : 3 524
Saluton,
Ton problème est intéressant car il semble simple, voire simpliste, mais sa résolution avec SQL m'apparaît assez ardue.
Pour obtenir cinq pays au hasard, ceci doit le faire :
Code mysql :
1
2
3
SELECT DISTINCT id_pay
FROM flatforswap_pays
ORDER BY RAND() LIMIT 5
Mais ensuite, obtenir aléatoirement un adhérent pour chaque pays ainsi sélectionné, c'est une autre paire de manches. D'autant que le lien entre id_pay et flatforswap_adherent passe par la jointure avec la table flatforswap_ville.
Je ne vois pas comment t'en sortir autrement qu'en récupérant les 5 id_pay en PHP et en contruisant 5 requêtes mises en UNION, chacune filtrée par un des id_pay, chacune avec un ORDER BY RAND() et un LIMIT 1.

Mais j'ai un doute, est-ce que MySQL acceptera les clauses ORDER BY et LIMIT pour chacune des requêtes entre les UNION, ou bien n'accepte-t-il qu'un seul ORDER BY et un seul LIMIT globaux, pour l'ensemble des SELECT liés par des UNION ?

Le plus simple est de tester.

Toutefois, les tables ont intérêt à bénéficier d'index sur les colonnes des jointures car, surtout si elles sont volumineuses, tout cela va être gourmand en ressources pour les serveurs.

Peut-être existe-t-il des solutions en SQL procédural et/ou avec une procédure stockée, mais cela dépasse mes compétences.
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
articles : Comment émuler un tableau croisé [quasi] dynamique
et : Une énigme mathématique résolue avec MySQL
recommande l'utilisation de PDO (PHP5 Data Objects)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2012, 14h22   #3
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 030
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 030
Points : 18 334
Points : 18 334
Envoyer un message via MSN à CinePhil
Citation:
Mais j'ai un doute, est-ce que MySQL acceptera les clauses ORDER BY et LIMIT pour chacune des requêtes entre les UNION
Je pense que oui mais à condition de bien isoler chaque sous-requête :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT A, B, C
FROM
(
  (SELECT A, B, C
  FROM la_table
  WHERE pays = une_valeur
  ORDER BY RAND()
  LIMIT 1)
 
UNION
 
  (SELECT A, B, C
  FROM la_table
  WHERE pays = une_autre_valeur
  ORDER BY RAND()
  LIMIT 1)
)
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h44.


 
 
 
 
Partenaires

Hébergement Web