Je viens d'effectuer de nouveaux tests de rapidité sur une table de 10000 entrées (en testant sur un renvoi de : 100, 500, 2000 puis 5000). la première méthode est la plus rapide (en moyenne 2 fois plus rapide que la méthode 2 - combinaison SQL/PHP - en fonction du nombre de valeurs à renvoyer qui en croissant donne nettement l'avantage à la méthode 1).
La méthode 3 est la plus lente voir problématique sur de grandes valeurs.
La méthode 4 qui semble fonctionner uniquement avec les versions de MySQL => 5.0.21 est sensiblement aussi rapide que la méthode 1.

1 - tri numérique sur age puis alphabétique sur prenom par SQL avec un subselect :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
SELECT individu_list.*
FROM (SELECT mt.* FROM my_table mt ORDER BY mt.age DESC LIMIT 2000) AS individu_list
ORDER BY individu_list.prenom;
2 - tri numérique sur age par SQL puis tri alphabétique sur prenom par PHP :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
 
<?php
$query = "SELECT mt.* FROM my_table mt ORDER BY mt.age DESC LIMIT 2000;
$result = mysql_query($query);
if (mysql_num_rows($result))
{<div style="margin-left:40px">while ($row = mysql_fetch_array($result))
{<div style="margin-left:40px">$individu_list[] = $row;</div>}
function sortByName($a, $b)
{<div style="margin-left:40px">if ($a['prenom'] == $b['prenom']) return 0;
return ($a['prenom'] < $b['prenom']) ? -1 : 1;</div>}
usort($individu_list, 'sortByName');</div>}
?>
3 - tri numérique sur age puis alphabétique sur prenom par SQL avec une auto jointure :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
SELECT mt1.id,mt1.prenom,mt1.age,count(*) AS rank
FROM my_table mt1
INNER JOIN my_table mt2
ON mt1.age <= mt2.age
GROUP BY mt1.id,mt1.prenom,mt1.age
HAVING rank <=2000
ORDER BY prenom;
4 - tri numérique sur age puis alphabétique sur prenom par SQL avec un double ORDER BY (MySQL => 5.0.21) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
(SELECT * FROM my_table mt
ORDER BY mt.age DESC LIMIT 2000)
ORDER BY prenom;