0

我似乎无法弄清楚为什么我的 ASC / DESC ORDER BY 没有按照我的意愿去做。

如果我单击价格列标题,它会继续订购整个表格数据,甚至超出页面上的限制?我该如何解决?

<?php
$c=$_GET['c'];
$s=$_GET['s'];
$d=$_GET['d'];
$l=$_GET['l'];
if($d==1) { $DIRECTION='ASC'; } elseif($d==0) { $DIRECTION='DESC'; } else { $DIRECTION='DESC'; }
if($l>51) { $l=50; } else { $l=$_GET['l']; }
$sql=mysql_query("SELECT id,title,price FROM listings WHERE status IN(0,1,4,5) ORDER BY $s $DIRECTION LIMIT $c,$l"); 
?>

这是网址的样子

c=10&s=price&d=1&l=25

所以上面的 url 显示了上升数据中第 10 行的 25 个条目,但是如果我单击价格列标题链接,我会将 ASC 更改为 DESC 并且它可以工作,但它会从最末端获得最低价格或最高价格表数据并忽略 LIMIT 10,25?

它是如何工作的?

提前感谢任何可以帮助强尼的人

4

1 回答 1

0

他们确实工作。这就是方式LIMITORDER BY旨在发挥作用。

也就是说,数据库总是在应用LIMIT子句之前对数据进行排序。如果要在LIMIT应用后对数据进行排序,有两种选择:

  • 使用 PHP 对其进行排序。这可能是一个相对简单的解决方案,如果您想避免数据库做这么多不必要的工作,可能会更好。但是,如果您将结果用作数据流,而不是在使用之前将所有内容读入数组,则可能会有点繁琐。

  • 使用子查询。LIMIT在这种情况下,您在排序之前强制应用该子句:

    SELECT * FROM (SELECT id,title,price FROM listings WHERE status IN(0,1,4,5) LIMIT $c,$l) ORDER BY $s $DIRECTION

于 2012-09-18T11:33:14.130 回答