在MySQL中排序多列

时间:2013-01-23 10:48:16

标签: php mysql

我的表格中有四列sale date 4sale date 3sale date 2sale date,这些列都是销售日期。在页面sale date 4中显示的优先级如果不是空的,我们会显示它,如果它是空的,则显示sale date 3,然后是sale date 2,然后是sale date。< / p>

我的问题是在对结果进行排序时。

何时通过

运行查询
order by 
isnull(`sale date 4`), trim(`sale date 4`) , 
isnull(`sale date 3`), trim(`sale date 3`) , 
isnull(`sale date 2`), trim(`sale date 2`) , 
isnull(`sale date`), trim(`sale date`) asc

我得到的结果如下

**sale date 4** | **sale date 3**  | **sale date 2** | **sale date**
--------------------------------------------------------------------
2013-01-24      | 2013-01-24       | 2013-01-24      | 2013-01-24    
2013-01-31      | 2013-01-31       | 2013-01-31      | 2012-11-30    
2013-02-01      | 2013-02-01       | 2013-02-01      | 2013-02-01    
2013-03-08      | 2013-03-08       | 2013-03-08      | 2013-03-08    
----NULL----    | ----NULL----     | 2013-02-28      | 2012-11-02    
----NULL----    | ----NULL----     | ----NULL----    | 2013-02-28

当我在视图中显示时,它将如下

1. Sale date = 2013-01-24
2. Sale date = 2013-01-31
3. Sale date = 2013-02-01
4. Sale date = 2013-03-08
5. Sale date = 2013-02-28
6. Sale date = 2013-02-28

但我需要的是

1. Sale date = 2013-01-24
2. Sale date = 2013-01-31
3. Sale date = 2013-02-01
4. Sale date = 2013-02-28
5. Sale date = 2013-02-28
6. Sale date = 2013-03-08

我该如何做到这一点?

2 个答案:

答案 0 :(得分:4)

isnull(column)只返回truefalse。这导致前4个记录是前4个结果(true > false),记录5和6是最后两个结果。然后,最后两个结果按sale date 4(两列中NULL)排序,最多为sale date 1,但它们仍然是有序列表中的最后两项。

你想做的事情可能是这样的:

.. ORDER BY IFNULL(`sale date 4`, IFNULL(`sale date 3`,
            IFNULL(`sale date 2`, `sale date 1`)))

答案 1 :(得分:2)

您可以通过以下方式订购:

coalesce(`sale date 4`, `sale date 3`, `sale date 2`, `sale date`)

COALESCE返回第一个非NULL值,例如

coalesce(1,2,3,4)             returns 1
coalesce(null,2,3,4)          returns 2
...
coalesce(null,null,null,null) returns null