如何订购和选择条件查询

时间:2018-03-29 08:22:20

标签: mysql sql

我有以下查询:

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

欢迎任何帮助

3 个答案:

答案 0 :(得分:2)

而不是:

ORDER BY price ASC

使用:

ORDER BY IF(price = 0, 1, 0), price ASC

Demo here

答案 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 = 0ORDER BY0子句中的1条件将返回falsetrue的值。默认情况下,它将按升序顺序排序。

因此,等于0的价格将1 (true)基于Price = 0条件的结果,并将放在最后一行,因为1 (true)大于0 (false)

请参阅 SQL Fiddle 示例

即使Price的数据类型为DECIMAL,将其等同于00.00也会对您想要的订单进行排序。

看看另一个 SQL Fiddle 示例。