按价格排序 ASC / DESC 问题

Posted

技术标签:

【中文标题】按价格排序 ASC / DESC 问题【英文标题】:ORDER BY price ASC / DESC problems 【发布时间】:2012-08-03 01:07:49 【问题描述】:

我似乎无法弄清楚为什么我的 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

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

它是如何工作的?

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

【问题讨论】:

啊,好的,谢谢 Thilo,然后告诉我你将如何注入它 s 或 c 上的验证为零(l 上的验证也很弱)。所以 ?s=(SELECT COUNT(*) FROM BIG_TABLE WHERE UNINDEXED_COLUMN=PRICE) 似乎是可能的。 也许吧,但也许你只是在抓住稻草,希望你能得到任何有价值的东西。我已经改变了整个事情,但我的问题是有效的。我基本上是在问为什么 LIMIT 在应用 ASC DESC 时不起作用。 【参考方案1】:

他们确实有效。这就是 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

【讨论】:

以上是关于按价格排序 ASC / DESC 问题的主要内容,如果未能解决你的问题,请参考以下文章

Mongoid Rails 4 按 asc 或 desc order created_at 排序

mysql中order by 排序用asc和desc不起作用怎么回事

SQL里面的排序语句desc和ASC有啥区别

SQL里面的排序语句desc和ASC有什么区别

8)排序分组

12排序