MySQL按日期和优先级排序

MySQL按日期和优先级排序,mysql,sql-order-by,Mysql,Sql Order By,我有一个网页,其中有一个表中的新闻数据 在许多情况下,我使用以下SQL: SELECT * FROM table ORDER BY insertDate DESC 点菜 ID|priority|insertDate 1 |NULL |2012-09-16 2 |NULL |2012-09-17 3 |NULL |2012-09-18 5 |NULL |2012-09-19 5 |NULL |2012-09-20 4 |1 |2010-05-10 - t

我有一个网页,其中有一个表中的新闻数据

在许多情况下,我使用以下SQL:

SELECT * FROM table ORDER BY insertDate DESC
点菜

ID|priority|insertDate
1 |NULL    |2012-09-16
2 |NULL    |2012-09-17
3 |NULL    |2012-09-18
5 |NULL    |2012-09-19
5 |NULL    |2012-09-20
4 |1       |2010-05-10 - this is way back in the future
但用户希望优先处理1条新闻。如果我使用

 SELECT * FROM table ORDER BY priority ASC ,insertDate DESC
它不能正常工作,我必须如何使用订单才能得到结果

ID|priority|insertDate
4 |1       |2010-05-10
1 |NULL    |2012-09-16
2 |NULL    |2012-09-17
3 |NULL    |2012-09-18
5 |NULL    |2012-09-19
5 |NULL    |2012-09-20
要将有效值设置为空优先级行,请执行以下操作:

SELECT * 
FROM table 
ORDER BY 
   coalesce(priority,0) ASC ,
   insertDate DESC
编辑

重新阅读您的问题,我发现正确的顺序是DESC而不是ASC:

   coalesce(priority,0) DESC ,
另外,请注意@yshavit注释。为了提高性能,可以将查询拆分为两个选项,第一个选项的值不为null

请记住,在创建此新字段时,这将避免合并和并集:

要将有效值设置为空优先级行,请执行以下操作:

SELECT * 
FROM table 
ORDER BY 
   coalesce(priority,0) ASC ,
   insertDate DESC
编辑

重新阅读您的问题,我发现正确的顺序是DESC而不是ASC:

   coalesce(priority,0) DESC ,
另外,请注意@yshavit注释。为了提高性能,可以将查询拆分为两个选项,第一个选项的值不为null

请记住,在创建此新字段时,这将避免合并和并集:


请注意,这意味着查询将无法使用索引进行排序。如果希望所有空值都是最后一个,而不是第一个,那么最好有两个选择,一个选择优先级不为空,另一个选择优先级为空,然后将它们合并。我现在无法尝试,但我想这将能够使用索引。请按coalescepriority从表顺序中选择*,0 DESC,insertDate DESC注意,这意味着查询将无法使用索引进行排序。如果希望所有空值都是最后一个,而不是第一个,那么最好有两个选择,一个选择优先级不为空,另一个选择优先级为空,然后将它们合并。我现在无法尝试,但我想这将能够使用index.SELECT*FROM table ORDER BY coalescepriority,0 DESC,insertDate DESC