Mysql 按日期订购ASC在有日期的记录之前放置无日期的记录?

Mysql 按日期订购ASC在有日期的记录之前放置无日期的记录?,mysql,sql,wordpress,Mysql,Sql,Wordpress,查询结果如下所示: 张贴A 职位B 邮递截止日期:8月2日 邮递截止日期:8月3日 邮递截止日期:8月4日 为什么没有\u due值的帖子总是先返回?我怎样才能让他们总是最后一个回来?如果我这样做: global $wpdb; $sql = "SELECT * FROM $wpdb->postmeta"; $sql .= " INNER JOIN $wpdb->posts ON $wpdb->postmeta.post_id = $wpdb->posts.ID"; $s

查询结果如下所示:

  • 张贴A
  • 职位B
  • 邮递截止日期:8月2日
  • 邮递截止日期:8月3日
  • 邮递截止日期:8月4日
  • 为什么没有
    \u due
    值的帖子总是先返回?我怎样才能让他们总是最后一个回来?如果我这样做:

    global $wpdb;
    
    $sql = "SELECT * FROM $wpdb->postmeta";
    $sql .= " INNER JOIN $wpdb->posts ON $wpdb->postmeta.post_id = $wpdb->posts.ID";
    $sql .= " WHERE $wpdb->posts.post_type = 'task'";
    $sql .= " AND $wpdb->posts.post_parent IN ( SELECT `ID` FROM $wpdb->posts WHERE `post_type` = 'task_list' AND `post_parent` IN ( SELECT `ID` FROM $wpdb->posts WHERE `post_status` = 'publish' AND `post_type` = 'project' ) )";
    $sql .= " AND $wpdb->postmeta.post_id IN ( SELECT `post_id` FROM $wpdb->postmeta WHERE $wpdb->postmeta.meta_key = '_completed' AND $wpdb->postmeta.meta_value = '0' )";
    $sql .= " AND $wpdb->postmeta.post_id IN ( SELECT `post_id` FROM $wpdb->postmeta WHERE $wpdb->postmeta.meta_key = '_assigned' AND $wpdb->postmeta.meta_value = '%s' )";
    $sql .= " AND $wpdb->postmeta.meta_key = '_due'";
    $sql .= " GROUP BY $wpdb->posts.ID";
    $sql .= " ORDER BY CAST( $wpdb->postmeta.meta_value AS DATE ) ASC, $wpdb->posts.ID ASC";
    
    $tasks = $wpdb->get_results( sprintf( $sql, $user_id ) );
    
    return $tasks;
    
    没有
    \u到期
    值的帖子被随机放置在具有
    \u到期
    值的帖子之间

    理想的结果应该是:

  • 邮递截止日期:8月2日
  • 邮递截止日期:8月3日
  • 邮递截止日期:8月4日
  • 张贴A
  • 职位B

  • 想法?

    您可以将函数isnull添加到order by子句中:

     $sql .= " ORDER BY $wpdb->posts.ID ASC, CAST( $wpdb->postmeta.meta_value AS DATE ) ASC";
    

    其中MAXDATE是比到期日值高的未来日期。

    那些没有到期日的被视为到期日为0,所以它们排在第一位。什么类型是
    postETA.meta\u值
    和无日期,你是指
    NULL
    date吗?那么这是单独列中的“Post X.due”和“August2”吗在不同的栏目里?@Jodrell:是
    长文本
    。不,它不是
    NULL
    而是
    empty
    值。仅供参考,这是一个Wordpress架构。@AshReva:No.
    Post X
    位于一个名为
    wp\u posts
    的单独表中。在mysql中ISNULL是IFNULL
    ORDER BY IFNULL(_due, MAXDATE)
    
    ORDER BY IFNULL(_due, MAXDATE)
    
    "ORDER BY CASE WHEN CAST( $wpdb->postmeta.meta_value AS DATE ) '' THEN 1 ELSE 0             
     END,CAST( $wpdb->postmeta.meta_value AS DATE )ASC, $wpdb->posts.ID ASC";