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。