ORDER BY 句を追加してクエリをやり直すだけです。確かに、このような単純なクエリで。
ただし、結果を配列に読み取ってから、php usort 関数を使用してそれらを目的の順序に並べ替えることができます (ただし、便利にするには、ページを更新するたびに詳細を保存する必要があります)。クライアント マシン (ただし、すべてのデータをクライアントにダウンロードする必要があるため、ページングによる速度の向上が台無しになります)
そしてphp内でこれを行う例(テストされていないので、タイプミスを許してください):-
<?php
switch (true)
{
case is_array($_SESSION['details']) AND $_POST['sort_order'] == 'id' :
$Details = $_SESSION['details'];
usort($Details, 'id_sort');
break;
case is_array($_SESSION['details']) AND $_POST['sort_order'] == 'name' :
$Details = $_SESSION['details'];
usort($Details, 'name_sort');
break;
case is_array($_SESSION['details']) AND $_POST['sort_order'] == 'dob' :
$Details = $_SESSION['details'];
usort($Details, 'dob_sort');
break;
case is_array($_SESSION['details']) AND $_POST['sort_order'] == 'home_town' :
$Details = $_SESSION['details'];
usort($Details, 'home_town_sort');
break;
default :
$sql = "SELECT id, name, dob, home_town FROM Persons";
$Query = $db->query($sql);
$Details = array();
while($row=$db->fetchAssoc($Query))
{
$Details[] = $row;
}
$_SESSION['details'] = $Details;
break;
}
foreach($Details AS $aDetail)
{
echo $aDetail['id']."\t".$aDetail['name']."\t".$aDetail['dob']."\t".$aDetail['home_town']."\r\n";
}
function id_sort($a,$b)
{
$RetVar = 0;
switch (true)
{
case $a['id'] > $b['id'] :
$RetVar = 1;
break;
case $a['id'] < $b['id'] :
$RetVar = -1;
break;
default :
$RetVar = 0;
break;
}
return $RetVar;
}
function name_sort($a,$b)
{
$RetVar = 0;
switch (true)
{
case $a['name'] > $b['name'] :
$RetVar = 1;
break;
case $a['name'] < $b['name'] :
$RetVar = -1;
break;
default :
switch (true)
{
case $a['id'] > $b['id'] :
$RetVar = 1;
break;
case $a['id'] < $b['id'] :
$RetVar = -1;
break;
default :
$RetVar = 0;
break;
}
break;
}
return $RetVar;
}
function dob_sort($a,$b)
{
$RetVar = 0;
switch (true)
{
case $a['dob'] > $b['dob'] :
$RetVar = 1;
break;
case $a['dob'] < $b['dob'] :
$RetVar = -1;
break;
default :
switch (true)
{
case $a['name'] > $b['name'] :
$RetVar = 1;
break;
case $a['name'] < $b['name'] :
$RetVar = -1;
break;
default :
switch (true)
{
case $a['id'] > $b['id'] :
$RetVar = 1;
break;
case $a['id'] < $b['id'] :
$RetVar = -1;
break;
default :
$RetVar = 0;
break;
}
break;
}
break;
}
return $RetVar;
}
function home_town_sort($a,$b)
{
$RetVar = 0;
switch (true)
{
case $a['home_town'] > $b['home_town'] :
$RetVar = 1;
break;
case $a['home_town'] < $b['home_town'] :
$RetVar = -1;
break;
default :
switch (true)
{
case $a['name'] > $b['name'] :
$RetVar = 1;
break;
case $a['name'] < $b['name'] :
$RetVar = -1;
break;
default :
switch (true)
{
case $a['id'] > $b['id'] :
$RetVar = 1;
break;
case $a['id'] < $b['id'] :
$RetVar = -1;
break;
default :
$RetVar = 0;
break;
}
break;
}
}
return $RetVar;
}
?>
これに関するアイデアは、詳細が保存されるということです(例ではセッション変数を使用しましたが、同様に、他の方法で保存することもできます)。詳細が見つかり、並べ替え順序が渡された場合は、usort を使用しますその詳細の配列をソートします。ソート順ごとに 1 つの関数が使用されるため、サブオーダーを変更することもできます (つまり、id は一意である必要があるため、それに基づいてソートできますが、この例のホームタウンはおそらく一意ではないため、その中の名前でソートします。そしてその中のid)。
そのレベルまで並べ替えを指定する必要はありませんが、この例では指定する価値があると思いました。