【问题标题】:ORDER BY date ASC placing records with no dates before records with dates?ORDER BY date ASC 将没有日期的记录放在有日期的记录之前?
【发布时间】:2013-08-09 08:17:37
【问题描述】:
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;

查询的结果是这样的:

  1. 发布 A.
  2. 发布 B.
  3. 发布 X。截止日期:8 月 2 日
  4. Y 后到期:8 月 3 日
  5. Z 后到期:8 月 4 日

为什么总是先返回没有_due 值的帖子?我怎样才能做到让它们总是最后返回?如果我这样做:

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

没有_due 值的帖子随机放置在有_due 值的帖子之间。

理想的结果应该是:

  1. 发布 X。截止日期:8 月 2 日
  2. Y 后到期:8 月 3 日
  3. Z 后到期:8 月 4 日
  4. 发布 A.
  5. 发布 B.

想法?

【问题讨论】:

  • 没有_due的被认为是到期0,所以他们排在第一位。
  • postmeta.meta_value 是什么类型,没有日期,您是指NULL 日期吗?
  • 那么这个“Post X. Due”在单独的列中,而“August2”在不同的列中?
  • @Jodrell:是longtext。不,不是NULL,而是empty 值。仅供参考,这是一个 Wordpress 架构。
  • @AshReva:没有。Post X 在一个名为 wp_posts 的单独表中。

标签: mysql sql wordpress


【解决方案1】:
"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";

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • ISNULL 在 mysql 中为 IFNULL
    【解决方案3】:
    ORDER BY IFNULL(_due, MAXDATE)
    

    其中 MAXDATE 是某个高于 _due 值的未来日期。

    【讨论】:

      猜你喜欢
      • 2013-04-21
      • 1970-01-01
      • 2019-06-09
      • 1970-01-01
      • 1970-01-01
      • 2012-05-24
      • 1970-01-01
      • 1970-01-01
      • 2015-12-06
      相关资源
      最近更新 更多