Tri PHP/MySQL

larfran

Membre actif
23 Avril 2010
145
4
Bonjour,

Je n'arrive pas à trier mes données correctement.
Une table présente les résultats d'une recherche triée par titre ou par auteur.

Il y en a une partie qui sont triés, et d'autres qui apparaissent pêle-mêle avant ou après la partie triée.

Comment expliquer et solutionner ce problème ?

merci de m'aider.
 
L'ordre de tri selon MySQL n'est pas nécessaire le meme que celui correspondant aux usages de la langue française...

Remarques-tu une constante dans les infos mal triées par rapport aux autres? Par exemple majuscule/minuscule, chiffres, lettres, espace accidentel, pour le premier caractère des titres/auteurs. Donne-nous davantage de precisions.
 
Par exemple, sur mon site :
http://lechansonnier.ca/index.php?lettretitre=P

En cliquant sur la lettre P dans la catégorie classement par Titres, on obtient le cas suivant :
2 titres non classés au début, puis un long classement alphabétique correct, puis un fourre-tout pêle-mêle.
Voir les images.

Voici le code :
<?php // Tableaux d'affichage par titre et auteur
$strsql = '';
if (isset($_GET['lettretitre']))
{
$lettretitre = $_GET['lettretitre'];
if ($lettretitre==='0')
$strsql = "SELECT titre,auteur,code1,code2,code3,code4,code5 FROM mabase.matable WHERE left(titre,1) REGEXP '[0-9]' AND code1 NOT IN ('PAR','SUG','AVN') ORDER BY titre";
else
$strsql = "SELECT titre,auteur,code1,code2,code3,code4,code5 FROM mabase.matable WHERE left(titre,1) COLLATE latin1_swedish_ci ='$lettretitre' AND code1 NOT IN ('PAR','SUG','AVN') ORDER BY titre COLLATE latin1_swedish_ci ='$lettretitre' ";
}

elseif (isset($_GET['lettreauteur']))
{
$lettreauteur = $_GET['lettreauteur'];
if ($lettreauteur==='0')
$strsql = "SELECT titre,auteur,code1,code2,code3,code4,code5 FROM mabase.matable WHERE left(auteur,1) REGEXP '[0-9]' AND code1 NOT IN ('PAR','SUG','AVN') ORDER BY auteur,titre";
else
$strsql = "SELECT titre,auteur,code1,code2,code3,code4,code5 FROM mabase.matable WHERE left(auteur,1) COLLATE latin1_swedish_ci ='$lettreauteur' AND code1 NOT IN ('PAR','SUG','AVN') ORDER BY auteur,titre COLLATE latin1_swedish_ci ='$lettreauteur' ";

}
if ($strsql != '')
{
$db = mysql_connect("localhost","mabase-matable","monmotdepasse");
$resultat = mysql_query($strsql,$db);
echo '<p id="attention">Attention de bien noter le site o&ugrave; se trouve la partition recherch&eacute;e!</p>';

echo '<br>';
echo '<p><font size="+1" Face="Arial">Cliquez sur le code adjacent au titre d&eacute;sir&eacute; qui correspond au site o&ugrave; se trouve la partition que vous voulez. Il vous suffira de la chercher ou de la commander sur ce site.</font></p>';
echo '<br>';
echo '<center>'.'<table width="819" cellpadding="2" cellspacing="0" border="0" bordercolor="#99FFFF" bgcolor="#002255">'."\n";
echo '<tr><td>CHA = Site du Chansonnier</td>';
echo '<td>EXG = Site d\'Extraguitare</td></tr>'."\n";
echo '<tr><td>TRK = Site de Trankyl</td>';
echo '<td>PIA = Site de Bernard Pialat</td></tr>'."\n";
echo '</table>'.'</center>'."\n";
echo '<center>'."\t\t".'<table bgcolor="#002255" width="819" cellpadding="0" cellspacing="0" border="1">'."\n";
echo "\t\t\t".'<tr><th><font SIZE="+1" face="ARIAL"><b>Auteur</b></th><th><font SIZE="+1" face="ARIAL"><b>Titre</th><th><font SIZE="+1" face="ARIAL"><b>Site 1</th><th><font SIZE="+1" face="ARIAL"><b>Site 2</th><th><font SIZE="+1" face="ARIAL"><b>Site 3</th><th><font SIZE="+1" face="ARIAL"><b>Site 4</th><th><font SIZE="+1" face="ARIAL"><b>Site 5</th></tr>'."\n";
$urlSite = array(
'CHA'=>'http://lechansonnier.ca/collaborateur.php',
'EXG'=>'http://extraguitare.fr.st/',
'TRK'=>'http://membres.lycos.fr/trankyl/',
'PIA'=>'http://perso.wanadoo.fr/bernard.pialat/'
);
while ( ($obj = mysql_fetch_object($resultat)) )
{
echo '<tr class="ligne">'; // d_but de la rang_e
echo '<td class="auteur">' . $obj->auteur . '</td>';
echo '<td class="titre">' . $obj->titre . '</td>';
if ( isset($urlSite[$obj->code1]) )
{
echo '<td class="site"><a href="'.$urlSite[$obj->code1].'" style=" text-decoration:none" target="_blank">'.$obj->code1.'</a></td>';
}

if ( isset($urlSite[$obj->code2]) )
{
echo '<td class="site"><a href="'.$urlSite[$obj->code2].'" style=" text-decoration:none" target="_blank">'.$obj->code2.'</a></td>';
}
if ( isset($urlSite[$obj->code3]) )
{

echo '<td class="site"><a href="'.$urlSite[$obj->code3].'" style=" text-decoration:none" target="_blank">'.$obj->code3.'</a></td>';
}
if ( isset($urlSite[$obj->code4]) )
{
echo '<td class="site"><a href="'.$urlSite[$obj->code4].'" style=" text-decoration:none" target="_blank">'.$obj->code4.'</a></td>';
}
if ( isset($urlSite[$obj->code5]) )
{
echo '<td class="site"><a href="'.$urlSite[$obj->code5].'" style=" text-decoration:none" target="_blank">'.$obj->code5.'</a></td>';
}
echo '</tr>'."\n";
}
echo "\t\t".'</table>'.'</center>'."\n";
mysql_close($db);
}
?>
Alors, que se pase-t-il ?
 
collation collate (locale <-> comparaison) apprend ca et ca t'évitera de poser des questions idiotes, et personnes n'ira fouiller dans ton gribouilli ce n'est pas du code.


COLLATE latin1_swedish_ci tout le monde sait bien que l'on parle suedois ici, mais de toutes les facons du a le resultat que tu demandes malgré le "sql" que tu as écris (je vois que monsieur n' a point des tables comportant des millions d'entrées)

sort author then by title, (p'tain faut etre vraiment cramé du cerveau pour coder en Francais)
 
Dernière édition: