2
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. Post X. 期日: 8 月 2 日
  4. Post Y. 期日: 8 月 3 日
  5. Post Z. 期限: 8 月 4 日

値のない投稿が_due常に最初に返されるのはなぜですか? それらが常に最後に返されるようにするにはどうすればよいですか? 私がこれを行う場合:

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

値のない投稿は、_due値のある投稿の間にランダムに配置され_dueます。

理想的な結果は次のようになります。

  1. Post X. 期日: 8 月 2 日
  2. Post Y. 期日: 8 月 3 日
  3. Post Z. 期限: 8 月 4 日
  4. ポストA。
  5. 投稿 B.

考え?

4

3 に答える 3

1

関数 isnull を order by 句に追加できます。

$sql .= " ORDER BY $wpdb->posts.ID ASC, ISNULL($wpdb->postmeta.meta_value),CAST( $wpdb->postmeta.meta_value AS DATE ) ASC";
于 2013-08-09T08:22:08.813 に答える
1
ORDER BY IFNULL(_due, MAXDATE)

ここで、MAXDATE は _due 値よりも後の将来の日付です。

于 2013-08-09T08:25:14.567 に答える