重新排序Mysql查询结果

时间:2018-07-10 14:12:56

标签: php mysql

我有以下mysql查询,其中id是从1,2 ...到450等自动递增的主键。

$query = "SELECT Id, PromA, PromB, PromC FROM Promtab Order by Id DESC Limit 200"; 
$aresult = $con->query($query);

以及以下PHP代码段:

<?php
while($row = mysqli_fetch_assoc($aresult)){
    echo "[".$row["Id"].", ".$row["PromA"].",".$row["PromB"].",".$row["PromC"]."],";
}
?>       

当我使用当前查询和php代码时,我得到结果(IdData DESC order):

    Id,  PromA, PromB, PromC
    450   230    220    200
    449   150    140    180
    448   221    70     145
    .
    .
    1     120    110    105

我需要的是(仅Id ASC order,数据顺序不变):

    Id,  PromA, PromB, PromC
     1   230    220    200
     2   150    140    180
     3   221    70     145
     .
     .
    450    120    110    105

如何简单地做到这一点?

谢谢。

5 个答案:

答案 0 :(得分:8)

如果我对您的理解正确,那么您将不希望看到针对行的实际ID,而只是看到从1到200的数字序列号(您有LIMIT 200)。在这种情况下,您可以执行以下操作:

$query = "SELECT PromA, PromB, PromC FROM Promtab Order by Id DESC Limit 200"; 
$aresult = $con->query($query);

$id = 1;
while ($row = mysqli_fetch_assoc($aresult)) {
    echo "[" . ($id++) . ", {$row['PromA']}, {$row['PromB']}, {$row['PromC']}]";
}

答案 1 :(得分:3)

您可以在sql中使用一个简单的内联变量(类似于@Raymond上面显示的变量)

select ( @var := ifnull( @var, 0 ) + 1 ) as `row`, `id`, `proma`,`promb`,`promc` 
from `promtab` 
order by `id` desc;

此方法要注意的一件事是,@var的值在查询结束时得到维护,因此后续查询将继续增加该值。要否定,您可以在运行初始查询后将值设置为null,即set @var=null;

如果查询的最终用途是HTML的简单显示,则css变量可能是最简单的选项,并且不需要对基本sql查询进行任何其他修改。

答案 2 :(得分:2)

您可以分别获取id数据和其他数据,然后同时显示它们

$queryForId = "SELECT Id FROM Promtab Order by Id ASC Limit 200"; 
$queryForData = "SELECT PromA, PromB, PromC FROM Promtab Order by Id DESC Limit 200";
$resultForId = $con->query($queryForId);
$resultForData = $con->query($queryForData);

,php部分为:

<?php
while($rowId = mysqli_fetch_assoc($resultForId)){
  $rowData = mysqli_fetch_assoc($resultForData);
echo "[".$rowForId["Id"].", ".$rowForData["PromA"].",".$rowForData["PromB"].",".$rowForData["PromC"]."],";
}
?>   

答案 3 :(得分:2)

您可以使用MySQL的用户变量在MySQL 8.0下的MySQL版本下模拟ROW_NUMBER()
您需要至少MySQL 5.0.51b才能使用MySQL的用户变量。

SELECT 
   (@ROW_NUMBER := @ROW_NUMBER + 1) AS Id
 , Promtab_ordered.* 
FROM (
  SELECT
      Promtab.PromA
    , Promtab.PromB
    , Promtab.PromC
   FROM
     Promtab
   ORDER BY
    Promtab.Id DESC
   LIMIT 200
) AS Promtab_ordered
CROSS JOIN ( SELECT @ROW_NUMBER := 0 ) AS init_user_param
ORDER BY 
 Id ASC

答案 4 :(得分:2)

如果我理解正确,则可以有效地将显示的顺序与数据库的顺序分开。

如果是这种情况,并且由于您要以数组形式返回结果,则可以对结果进行迭代(未测试):

$resultsArray = mysqli_fetch_array($aresult));
for($i = 0; $i <= count($resultsArray); $i){
    // $i will be your index. Your query will return the results descending
}

希望有帮助