0

I've got a WordPress database with a custom post type called events with custom fields for startdates and enddates of the events. I would like to output all of those events in a list having the upcoming events listed first in an ascending order and the rest listed in a descending order.

I tried to copy the code from this answer but i can't seem to get it right – all the posts are sorted ascendingly: MySQL conditional ORDER BY ASC/DESC for date column

This is my code right now:

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 に精通していないため、2 番目のケースでは 1 つか 2 つの変換が必要になる場合があります。

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 では、これを少し異なる方法で行う必要がある場合があります。その 2 番目のレベル内では、最初のレベルの値が等しい場合にのみ並べ替えが適用されるため、機能します。したがって、今後のすべてのイベントは一番上に並べ替えられ、今後のイベント内では昇順に並べ替えられます。過去のすべてのイベントが次に表示され、そのリスト内では、日付の値が逆になっているため、降順で並べ替えられます。

于 2012-12-03T15:55:35.800 に答える