以下是我目前所做的预览:
MySQL表:
我想要做的是能够以某种方式对此进行排序。我希望所有“免费”的行都位于最顶层,因此special_price等于0.00。
我还希望所有具有特殊功能的行都在此之后,然后所有具有正常价格的行都将在此之后。有没有办法在没有指定sort_id的情况下这样做,这样用户就不必自己更改订单了?
因此,在上面的示例中,最后一个字段“Testing”将向上移动一个,“Replace Air Filter”将是最后一个。
现在在我的查询中没有ORDER BY,所以它是按id排序的。
感谢任何帮助。谢谢!
答案 0 :(得分:2)
ORDER BY COALESCE(special_price,99999) ASC, price ASC
应该这样做。
COALESCE
是一个获取第一个非空值的函数,所以只要你有一个零特价,它就会默认为99999
(只是一些任意高的数字才能得到它订购)。从那里我们订购价格,所以任何关系,以及列表的结尾,将按价格按升序排列。
答案 1 :(得分:1)
您可以将两个选项与UNION
SELECT * FROM `table` WHERE `special_price` IS NOT NULL ORDER BY `special_price` ASC,`price` ASC;
UNION ALL
SELECT * FROM `table` WHERE `special_price` IS NULL ORDER BY `price` ASC;
我不知道,从性能的角度来看,这是怎么回事,但据我所知,这就像两个简单的查询一样,来自UNION
的开销很小。
次要更新:因为两个查询都不能返回相同的记录,所以不需要默认行为UNION DISTINCT
,我希望UNION ALL
只是性能更高一点。
答案 2 :(得分:1)
如果要对大量行进行排序,使用函数返回值对结果进行排序可能会非常慢,因为MySQL无法使用索引对这些值进行排序。那么如何解决这个问题?
如果某个项目必须处于特殊状态以便免费(您可以尝试使用表格布局图像中的情况),您可以尝试:
SELECT *, special_price IS NULL AS not_special
FROM tablename
ORDER BY not_special ASC, special_price ASC, price ASC;
如果项目处于特殊状态,则会在结果中添加一个额外的列,如果不是则为1。然后,我们将所有“特殊”商品放在排序的顶部,并按特价和价格上涨排序。
这将允许您避免UNION
的开销,仍然使用索引进行排序操作,并在使用函数返回值排序大量行时避免非常慢的查询...但仅限于项目必须是特殊的才能免费。
答案 3 :(得分:0)
试
SELECT * FROM table_name ORDER BY CASE special_price
WHEN '0.00' THEN 1
WHEN null THEN 3
ELSE 2
END