ORDER BY无法在PHP / MySQL中按预期方式工作

时间:2018-12-30 20:35:15

标签: php mysql sorting

我的代码:

$afer_result = mysql_query("SELECT * FROM aq_afers WHERE aferId = '".$afer_id."'");

while ($afer = mysql_fetch_array($afer_result)) {
$item_result = mysql_query("SELECT * FROM aq_".$afer['ItemCategory']."s WHERE ItemId = '".$afer['ItemId']."' ORDER BY ItemLevel");
$item = mysql_fetch_assoc($item_result);

echo $item['ItemLevel'];
echo "\n";
}

我希望输出是从最低到最高排序的数字列表,但这就是我的输出:

10
37
62
15
35
55
75
95
105
70
40
50
15
35
1
55

有人知道为什么ORDER BY无法正常工作吗?

3 个答案:

答案 0 :(得分:0)

您的代码选择类别,然后遍历每个类别。 它为排序的每个类别选择ItemLevel,但不是同时选择所有类别。 对于第一类10、37、62 第二类:15、35、55、75、95、105 第三类:70 等等

因此,您应该将2个sql查询合并为一个并排序结果。
如果不可能,则应将项目级别存储到数组中并对其进行排序,然后再打印出来。

$afer_result = mysql_query("SELECT * FROM aq_afers WHERE aferId = '".$afer_id."'");
$itemLevels = [];
while ($afer = mysql_fetch_array($afer_result)) {
    $item_result = mysql_query("SELECT * FROM aq_".$afer['ItemCategory']."s WHERE ItemId = '".$afer['ItemId']."' ORDER BY ItemLevel");
    $item = mysql_fetch_assoc($item_result);
    $itemLevels[] = $item['ItemLevel'];
}
asort($itemLevels);
foreach ($itemLevels as $itemLevel) {
    echo $itemLevel;
    echo "\n";
}

答案 1 :(得分:0)

您的代码存在的问题是您在一个循环中运行了多个查询。每个查询的结果都是有序的,而不是全局结果。

一种解决方案是使用循环来构建UNION sql查询。您可以在循环外运行查询; UNION查询的ORDER BY子句全局应用于其结果。当然,这假设所有查询都返回相同的列(否则您将需要修改代码)。

代码;

$afer_result = mysql_query(
    "SELECT * 
    FROM aq_afers 
    WHERE aferId = '".$afer_id."'"
);

$sql_parts = array();
while ($afer = mysql_fetch_array($afer_result)) {
    array_push(
        $sql_parts,
        "SELECT * 
          FROM aq_".$afer['ItemCategory']."s
          WHERE ItemId = '".$afer['ItemId']."'"
    );
}

$sql = join(' UNION ALL ', $sql_parts);
$item_result = mysql_query($sql . 'ORDER BY ItemLevel');
while ($item = mysql_fetch_array($item_result)) {
    echo $item['ItemLevel'];
    echo "\n";
}

答案 2 :(得分:-3)

我认为您应该使用以下代码:-

 $item_result = mysql_query("SELECT * FROM aq_".$afer['ItemCategory']."s WHERE ItemId = '".$afer['ItemId']."' ORDER BY ItemLevel ASC");