我有以下查询:
SELECT * FROM table WHERE some conditions ORDER price ASC
整个查询更多:
SELECT * FROM products WHERE some conditions ";
if (($_GET['Category']) =='X'){
switch( $_GET['price'] ){
case '':
$query_RS_Search .= ' some conditions ORDER BY price ASC';
break;
case '0-500':
$query_RS_Search .= ' some conditions ORDER BY price ASC';
break;
case '500-1000':
etc
break;
}else{switch( $_GET['price'] ){
case '':
$query_RS_Search .= ' some conditions ORDER BY price ASC';
break;
case '0-500':
$query_RS_Search .= ' some conditions ORDER BY price ASC';
break;
case '500-1000':
etc
break; }}
我想要做的是相同的查询,但价格是0.00这需要是最后一个而不是第一个。
例如,我有以下产品:
product 1 price £15
product 2 price £25
product 3 price £12
product 4 price £0
我想订购如下:
product 3 £12
product 1 £15
product 2 £25
product 4 £0
然而,我得到的顺序是:
product 4 £0
product 3 £12
product 1 £15
product 2 £25
欢迎任何帮助
答案 0 :(得分:2)
答案 1 :(得分:1)
假设你想按价格上涨订购,除非价格为0,那么它需要是最后的。
ORDER BY (CASE WHEN price = 0 THEN 1 ELSE 0 END) ASC, price ASC
如果您的价格包含实际的英镑符号,首先不是好的数据库设计,但第二,您必须将查询修改为:
ORDER BY (CASE WHEN price = '£0' THEN 1 ELSE 0 END) ASC, price ASC
这种方式第一优先级排序是通过一个伪字段发生的,当价格为0时它只有1并且将按升序排序,这意味着任何价格!= 0将是之前的第一个和价格== 0.之后,我们继续按价格上涨订购。在您的示例中,这将是:
product 3 £12
product 1 £15
product 2 £25
product 4 £0
请记住,这对任何负面价格都不起作用。如果负价格也会显示在最后,则您必须修改CASE语句以适用于price <= 0
。
答案 2 :(得分:1)
尝试:ORDER BY Price = 0, Price ASC
如果结果分别为Price = 0
或ORDER BY
,0
子句中的1
条件将返回false
或true
的值。默认情况下,它将按升序顺序排序。
因此,等于0
的价格将1 (true)
基于Price = 0
条件的结果,并将放在最后一行,因为1 (true)
大于0 (false)
。
请参阅 SQL Fiddle 示例
即使Price
的数据类型为DECIMAL
,将其等同于0
或0.00
也会对您想要的订单进行排序。
看看另一个 SQL Fiddle 示例。