按价格排序 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】:他们确实有效。这就是 LIMIT
和 ORDER 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 排序