对结果进行排序mysql/php


sorting a result mysql/php

假设我有一个装满手机的列表。很容易将所有手机打印成无序列表,如:

$get_phones = $mysqli->query("
SELECT
    a.id,
    b.phone_id,
    a.phonename AS pname,
    b.modelname AS mname,
FROM phone_brands 
a LEFT OUTER JOIN phone_models b
ON a.id = b.phone_id");
while($phones = $get_phones->fetch_assoc()){
echo $phones['pname'] . $phones['mname'];}

但是,我如何通过对所有型号和手机进行排序来提高列表的可读性,比如:

Iphone
3G
3GS
4G

诺基亚
Lumia 1020
Lumia 925
Lumia 520

我的猜测是,我应该做一些类似的事情:

if($phones['pname'] == $phones['pname']{}

但我不知道我是不是离这里很远?如有任何帮助,我们将不胜感激:)

当然,您可以通过mname:订购查询

$get_phones = $mysqli->query("
SELECT
    a.id,
    b.phone_id,
    a.phonename AS pname,
    b.modelname AS mname,
FROM phone_brands 
a LEFT OUTER JOIN phone_models b
ON a.id = b.phone_id
ORDER BY mname");

然后在php中执行以下操作:

$currentModel = "";
while($phones = $get_phones->fetch_assoc()){
    if($currentModel != $phones['mname']){
        echo $phones['mname'].'<br/>';
        $currentModel = $phones['mname'];
    }
    echo $phones['pname'];
}

在数据库级别上进行排序要快得多,最终结果是一样的。您可以在PHP数组中读取它并对其进行排序。

$get_phones = $mysqli->query("
SELECT
    a.id,
    b.phone_id,
    a.phonename AS pname,
    b.modelname AS mname,
FROM phone_brands 
a LEFT OUTER JOIN phone_models b
ON a.id = b.phone_id
order by pname, mname");
SELECT
    a.id,
    b.phone_id,
    a.phonename AS pname,
    b.modelname AS mname,
FROM phone_brands AS a 
LEFT OUTER JOIN phone_models AS b
    ON a.id = b.phone_id
ORDER BY pname, mname DESC

这应该从你的问题中得到答案吗?

[编辑]

我需要改进代码,我正在考虑使用foreach之类的东西,这样它在以后更可用,而不仅仅是订购:p–Simon Duun

继续注释,您仍然可以在查询中使用order by,但可以执行以下操作:

$phone_array = array();
while($phones = $get_phones->fetch_assoc()){
    $phone_array[$phones['pname']] =  $phones['pname'] . $phones['mname'];
}
ksort($phone_array);
foreach($phone_array as $phone_pname => $phone_value){
    echo $phone_pname . ' -> ' . $phone_value . "'r'n";
}