0

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

我试图从这个答案复制代码,但我似乎无法正确 - 所有帖子都按升序排序:MySQL conditional ORDER BY ASC/DESC for date column

这是我现在的代码:

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
4

2 回答 2

1

删除 中的第一个子句order by。它应该是:

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

实际上,我不确定 NULL 在 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
于 2012-12-03T15:50:20.273 回答
1

认为这会做到。逻辑是合理的,但我对 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 可能会要求您以不同的方式执行此操作。它之所以有效,是因为在第二级中,排序仅在第一级的值相等时才适用:因此所有即将发生的事件将被排序到顶部,并且在这些即将发生的事件中,按升序排序。所有过去的事件将在接下来显示,并且在该列表中它们将降序排序,因为我们反转了日期值。

于 2012-12-03T15:55:35.800 回答