Php MySQL中多列的Order by

Php MySQL中多列的Order by,php,mysql,Php,Mysql,我的表中有四列销售日期4,销售日期3,销售日期2,销售日期,它们都是销售日期。在第页显示销售日期4时,如果它不是空的,我们将优先显示它,如果它是空的,则显示销售日期3,然后是销售日期2,然后是销售日期 我的问题是在对结果进行排序时 何时使用order by运行查询 order by isnull(`sale date 4`), trim(`sale date 4`) , isnull(`sale date 3`), trim(`sale date 3`) , isnull(`sale da

我的表中有四列
销售日期4
销售日期3
销售日期2
销售日期
,它们都是销售日期。在第
页显示销售日期4时,如果它不是空的,我们将优先显示它,如果它是空的,则显示
销售日期3
,然后是
销售日期2
,然后是
销售日期

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

何时使用order by运行查询

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
当我在视图中显示时,它将如下所示

**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
如何实现这一点?

isnull(column)
只返回
true
false
。这导致前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`)))
您可以通过以下方式订购:

coalesce(`sale date 4`, `sale date 3`, `sale date 2`, `sale date`)
返回第一个非空值,例如

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

列名中有空格吗?在MySQL中,列名中的空格实际上是可能的(尽管这并不是最好的做法)。如果这是Vamsi想要的,我认为COALESCE会简单得多,但是规范实际上要求一些稍微不同的东西——至少对我来说,是无法理解的!正如我所理解的问题(以及从我对预期输出的猜测),这正是OP想要的。虽然
COALESCE
确实更简单(我不知道这个,谢谢!)。我同意这个问题并不十分清楚-但是@helmbert很好地填补了问题的抽象空白:-)好的,那么为什么第四个结果“2013-02-28”呢?据我所知,记录为4+5(都是2013-02-28)有序结果集的记录是输入集的记录5+6。