Ordonner une liste déroulante sur deux champs

Petit nouveau ! | 1 Messages

07 déc. 2008, 17:29

Bonjour à toutes et à tous,

J'ai quelques soucis pour ordonner une liste déroulante à double entrée. Je vous explique (en essayant d'être clair)...
Je m'occupe d'un site qui traite de polar et qui comporte une page spécifique liée à la recherche de romans selon des critères donnés. Dernièrement, j'ai ajouté dans ces critères le choix du traducteur. Or, il se trouve que régulièrement, les traductions se font à quatre mains.
Donc, dans une table intitulée "traduction", j'ai plusieurs champs qui sont "prenom1", "nom1", "prenom2", "nom2".
Le but est d'afficher sur cette page de recherche une liste déroulante qui reprend l'ensemble des noms des traducteurs en mixant les "nom1" et "nom2" et en les classant dans un ordre alphabétique "général".

Pour l'instant, j'ai bien ma boite, mais l'ordonnancement se fait fait uniquement sur "nom1" et affiche le nom du second traducteur ("nom2") directement après. L'ordre alphabétique souhaité n'est pas respecté.

Auriez-vous une solution à me proposer ?

Voici le code de la boite déroulante :
<select name="traducteur" class="texte_p">
	<option value="indif">Indiff&eacute;rent</option>
	<?php
		$query=mysql_query("SELECT DISTINCT prenom1,nom1,prenom2,nom2 FROM traduction ORDER BY nom1,nom2") or die (mysql_error());
		while ($row=mysql_fetch_array($query))
		{
			echo "<option value=\"".$row['nom1']."\"";
			if (isset($_GET['traducteur']) && $_GET['traducteur']==$row['nom1'])
			echo " selected";
			if (isset($_POST['traducteur']) && $_POST['traducteur']==$row['nom1'])
			echo " selected";
			echo ">";
			if ($row['prenom1']!="0")
			echo $row['prenom1'];
			echo " ";
			echo $row['nom1'];
			echo "</option>\n";
			if ($row['nom2']!="0")
			echo "<option value=\"".$row['nom2']."\"";
			if (isset($_GET['traducteur']) && $_GET['traducteur']==$row['nom2'])
			echo " selected";
			if (isset($_POST['traducteur']) && $_POST['traducteur']==$row['nom2'])
			echo " selected";
			echo ">";
			if ($row['prenom2']!="0")
			echo $row['prenom2'];
			echo " ";
			echo $row['nom2'];
			echo "</option>\n";
		}
	?>
	</select>
La page où cette liste apparaît (c'est la dernière, en bas à gauche) :
http://www.polarnoir.fr/recherche.php
Par exemple, si "Pierre Lorrain" apparaît en troisième position alors qu'il devrait être classé à "P". C'est parce qu'il est associé dans une traduction à son prédécesseur dans la liste, "Galia Ackerman". "Pierre Lorrain" est un "nom2".
De plus, il ne renvoi aucun résultat... Mais là, c'est un autre problème...

Merci d'avance pour votre aide.

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

18 déc. 2008, 22:15

Ce qu'il te faut c'est une requête d'union qui réunie dans le même résultat, les résultats de deux requêtes qui sélectionnent chacune les noms et prénoms des champs nom1, prenom1 et nom2, prenom2. Pour ce faire voici l'analyse:

Premièrement il faut savoir que l'union de deux requêtes ne peut être réalisée que si les résultats des deux requêtes ont le même nombre et format de champs (colonnes) ce qui est le cas ici, puisque les 2 requêtes vont retourner 2 colonnes identiques dans leur format : nom et prenom.

La première requête doit sélectionner les noms et prénoms se trouvant dans les champs nom1 et prenom1:

Code : Tout sélectionner

SELECT DISTINCT prenom1 as prenom, nom1 as nom FROM traduction
La deuxième requête doit sélectionner les noms et prénoms se trouvant dans les champs nom2 et prenom2:

Code : Tout sélectionner

SELECT DISTINCT prenom2 as prenom, nom2 as nom FROM traduction
Donc, la requête finale doit faire une union des deux premières requêtes. Et cela donne:

Code : Tout sélectionner

SELECT DISTINCT prenom1 as prenom, nom1 as nom FROM traduction UNION SELECT DISTINCT prenom2 as prenom, nom1 as nom FROM traduction
Maintenant, si tu tiens au classement (tri) par nom il faut appliquer une requête de tri à cette union. Voici comment:

Code : Tout sélectionner

SELECT RG.prenom, RG.nom FROM ( SELECT DISTINCT prenom1 as prenom, nom1 as nom FROM traduction UNION SELECT DISTINCT prenom2 as prenom, nom1 as nom FROM traduction ) as RG ORDER BY RG.nom
C'est donc cette dernière forme qui est la requête finale. L'alias RG est donné à l'union, c'est obligatoire quand on utilise des requêtes imbriquées de les distinguer par un alias dans la clause FROM.

Mais attention : Cette forme de requêtes imbriquées n'est supportée qu'à partir de MYSQL 4.1
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène