Mysql 如何按日期排序SQL结果>;现在()ASC和其他描述?

Mysql 如何按日期排序SQL结果>;现在()ASC和其他描述?,mysql,sql,conditional-statements,Mysql,Sql,Conditional Statements,我有一个WordPress数据库,它有一个名为events的自定义post类型,带有事件开始日期和结束日期的自定义字段。我想在一个列表中输出所有这些事件,即将发生的事件以升序排列,其余的以降序排列 我试图从这个答案中复制代码,但我似乎做不好——所有帖子都按升序排列: 这是我现在的代码: SELECT p.post_title, m.meta_value FROM wp_posts as p, wp_postmeta as m WHERE p.ID = m.post_id AND p

我有一个WordPress数据库,它有一个名为events的自定义post类型,带有事件开始日期和结束日期的自定义字段。我想在一个列表中输出所有这些事件,即将发生的事件以升序排列,其余的以降序排列

我试图从这个答案中复制代码,但我似乎做不好——所有帖子都按升序排列:

这是我现在的代码:

SELECT p.post_title, m.meta_value 
FROM wp_posts as p, wp_postmeta as m 
WHERE p.ID = m.post_id 
    AND p.post_type = "events"
    AND m.meta_key = "startdate" 
    AND p.post_status = "publish"
ORDER BY m.meta_value ASC,
    CASE m.meta_value WHEN m.meta_value > DATE(NOW()) THEN m.meta_value END ASC,
    CASE WHEN m.meta_value < DATE(NOW()) THEN m.meta_value END DESC
LIMIT 10
选择p.post\u标题、m.meta\u值
从wp_发布为p,wp_发布为m
其中p.ID=m.post\u ID
和p.post_type=“事件”
和m.meta_key=“开始日期”
和p.post_status=“发布”
按m.meta_值ASC排序,
案例m.meta_值当m.meta_值>日期(现在())时,则m.meta_值结束ASC,
当m.meta_值<日期(现在())时,则m.meta_值结束描述
限制10

删除排序依据中的第一个子句。应改为:

ORDER BY 
    CASE m.meta_value WHEN m.meta_value > DATE(NOW()) THEN m.meta_value END ASC,
    CASE WHEN m.meta_value < DATE(NOW()) THEN m.meta_value END DESC
orderby
案例m.meta_值当m.meta_值>日期(现在())时,则m.meta_值结束ASC,
当m.meta_值<日期(现在())时,则m.meta_值结束描述
实际上,我不确定postgres中空值的排序顺序是什么。您可以通过以下操作获得您想要的:

ORDER BY 
    CASE m.meta_value WHEN m.meta_value > DATE(NOW()) THEN m.meta_value
                      else cast('9999-01-01' as date) END ASC,
    CASE WHEN m.meta_value < DATE(NOW()) THEN m.meta_value END DESC
orderby
案例m.meta_值当m.meta_值>日期(NOW())然后m.meta_值
else cast('9999-01-01'作为日期)结束ASC,
当m.meta_值<日期(现在())时,则m.meta_值结束描述
我想这样就可以了。逻辑是合理的,但我对mysql不太熟悉,因此在第二种情况下,您可能需要进行一两次转换:

ORDER BY CASE WHEN m.meta_value > DATE(NOW()) THEN 0 ELSE 1 END,
         CASE WEHN m.meta_value > DATE(NOW()) THEN m.meta_value ELSE m.meta_value * -1 END

诀窍在于,您希望将日期视为一个数字,mysql可能会要求您做一些不同的事情。它之所以有效,是因为在第二个级别中,排序仅在第一个级别的值相等时适用:因此所有即将发生的事件都将被排序到顶部,而在这些即将发生的事件中,排序是升序的。接下来将显示所有过去的事件,在该列表中,它们将按降序排序,因为我们反转了日期值。

这有效吗?我认为如果一个值与任何条件都不匹配,CASE需要计算为NULL,而为了进行比较,mysql会将NULL视为0。。。在日期的情况下,这意味着过去的事件被排序到顶部,因为在当前日期之前有数字?我没有让任何这些都起作用,我只得到一个事件的升序列表–与运行“按字段asc从表顺序选择*相同”。无论如何谢谢你!快成功了!即将到来的事件以正确的顺序出现,但之前的事件则以上升的顺序出现。知道为什么吗?m.meta_值*-1没有做它应该做的事情。可能改用1-m.meta_值,或者研究某种类型的cast/convert。我想我已经尝试了这里的一切(猜你正在做的有点像:cast(m.meta_值为DATE)等等),但我不习惯在SQL中使用条件语句,所以我几乎不知道我在做什么。是否可以用另一种方式来实现这一点,比如以某种方式使用联接?尝试强制转换为unixtime或整数。在第二种情况下,我要做的是得到一个负的日期值,它具有相同的振幅,所以当你对负值进行升序排序时,就好像我们对原始值进行降序排序一样。你明白吗?是的,成功了!我只是给所有东西加上时间戳。谢谢!:)