我有以下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代码时,我得到结果(Id
和Data
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
如何简单地做到这一点?
谢谢。
答案 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
}
希望有帮助