订购价格ASC / DESC问题

时间:2012-08-03 01:07:50

标签: sql-order-by limit

我似乎无法解决为什么我的ASC / DESC ORDER BY没有按照我的意愿行事。

如果我单击价格列标题,它会命令整个表数据甚至超出页面上的LIMIT?我该如何解决这个问题?

<?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

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

它是如何运作的?

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

1 个答案:

答案 0 :(得分: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