【问题标题】:ORDER BY date and include records that don't have date? [duplicate]ORDER BY date 并包括没有日期的记录? [复制]
【发布时间】:2013-04-21 06:46:30
【问题描述】:

是否可以按 DATE 对记录进行排序,但仍包括没有日期值的记录?后者将被放置在列表的末尾。

这是一个 wordpress 查询,但我认为我的问题在这里更合适:

$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 .= " AND CAST( $wpdb->postmeta.meta_value AS DATE )";
$sql .= " GROUP BY $wpdb->posts.ID";
$sql .= " ORDER BY $wpdb->postmeta.meta_value ASC";

如何修改?

【问题讨论】:

  • 是的,有可能。你试过了吗?
  • AND CAST( $wpdb->postmeta.meta_value AS DATE ) 应该达到什么目的?

标签: php mysql datetime


【解决方案1】:

只需删除条件 WHERE … CAST( $wpdb->postmeta.meta_value AS DATE ),因为这会从结果中删除 NULL 日期。没有它,行将被包括在内,并且排序不会改变这一点。然后,您可以在 ORDER BY 部分中重新插入该表达式以按日期排序。 NULL 值将被排序到开头,即你的比较小于非NULL 值。

【讨论】:

    【解决方案2】:

    这个成功了:

    $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 $wpdb->posts.ID ASC, CAST( $wpdb->postmeta.meta_value AS DATE ) ASC";
    

    感谢您的帮助!

    【讨论】:

      【解决方案3】:

      尝试 SELECT * FROM TABLE ORDER BY date

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-21
        • 1970-01-01
        • 2021-02-22
        • 2010-10-23
        • 2019-07-05
        • 2018-01-26
        相关资源
        最近更新 更多