【发布时间】:2018-04-25 15:25:20
【问题描述】:
我需要按三个字段获取有序列表。
$sql = "
SELECT
SQL_CALC_FOUND_ROWS $wpdb->posts.ID
FROM
$wpdb->posts
INNER JOIN
$wpdb->postmeta ON ( $wpdb->posts.ID = $wpdb->postmeta.post_id )
INNER JOIN
$wpdb->postmeta AS mt1 ON ( $wpdb->posts.ID = mt1.post_id )
WHERE
1=1
AND
(
( mt1.meta_key = 'pub_series' AND mt1.meta_value = 'Book' )
OR ( mt1.meta_key = 'pub_series' AND mt1.meta_value = 'Book chapter' )
OR ( mt1.meta_key = 'pub_series' AND mt1.meta_value = 'Journal Article' )
)
/*AND
(
mt3.meta_key = 'forthcoming'
)*/
AND
$wpdb->postmeta.meta_key = 'pub_year'
AND
$wpdb->posts.post_type = 'publication'
AND
$wpdb->posts.post_status = 'publish'
GROUP BY
$wpdb->posts.ID
ORDER BY
/*FIELD(mt3.meta_key, 'forthcoming') DESC,
FIELD(mt3.meta_value, 'null') DESC,*/
//FIELD($wpdb->postmeta.meta_value,1),
$wpdb->postmeta.meta_value DESC,
$wpdb->posts.post_date DESC
";
$total = count($wpdb->get_results($sql));
$offset = ( $paged * $posts_per_page ) - $posts_per_page;
$results = $wpdb->get_results( $sql . "
LIMIT
$offset, $posts_per_page" );
这是按两个字段查询排序列表:[custom_field] pub_year(可能的值 2018、2017...)和 [delautl wp post date field] post_date。没关系。
但现在我需要显示 [custom_field] 即将到来 = 1 的项目。如果此字段存在三种状态,则存在以下问题: - 即将到来的项目 = 1 - 即将到来的项目 = 0 - 以及即将到来的自定义字段不存在的项目
我需要获得即将到来的第一个项目 = 1 的有序列表,其他项目应按 pub_year 和日期排序。我怎么能做到这一点。如果您需要更多信息,请告诉我。非常感谢。
【问题讨论】:
-
我无法理解这里发生了什么。为什么这个查询如此巨大?为什么它在 SQL 内部有
$wpdb->posts.post_date之类的东西?为什么您要竭尽全力减少 WPDB 可以为您做的事情,而是创造大量 SQL 注入机会? -
我不知道 WPDB 语法的细节,但标准 SQL 将使用 case 表达式进行第一次按段排序 - 比如 ORDER BY CASE WHEN 即将到来 = 1 THEN 1 ELSE 2 END,(此处的其余订单)。
标签: mysql wordpress sql-order-by