【问题标题】:$wpdb - sort by two meta value$wpdb - 按两个元值排序
【发布时间】:2015-10-11 03:17:12
【问题描述】:

我有“类型”自定义字段和两个值(免费和付费)。我需要在循环中首先获得“付费”帖子,并获得最新的免费帖子。如何对查询进行排序?我不能使用 wp_query。

global $wpdb;
$query = "
    SELECT *
    FROM $wpdb->posts
    INNER JOIN $wpdb->postmeta m1
      ON ( $wpdb->posts.ID = m1.post_id )
    WHERE
        $wpdb->posts.post_type = 'object'
    AND $wpdb->posts.post_status = 'publish'
    AND ( m1.meta_key = 'type' AND m1.meta_value = $type )
    GROUP BY $wpdb->posts.ID
    ORDER BY $wpdb->posts.post_date
    DESC;
  ";

【问题讨论】:

  • 如果你包含一些数据样本和期望的输出会很容易。

标签: mysql sql sorting wordpress


【解决方案1】:

您目前正在按 post_date 排序,因此最旧的将首先显示,最新的最后显示。对于同一日期的所有行,mysql 将决定顺序。如果你想保持这个日期顺序,但总是在特定日期首先显示付费的,那么你可以添加第二个排序属性:

ORDER BY $wpdb->posts.post_date, meta_value DESC

DESC 将确保“付费”出现在“免费”之前,如果这些是您的实际值。这也是假设只有两个值。如果您可能有更多值,那么值得研究 mysql CASE expression

【讨论】:

  • 我在帖子中还有 50 个自定义字段。我不想按日期保留订单。
【解决方案2】:

很简单。

global $wpdb;
$query = "
SELECT *
FROM $wpdb->posts
INNER JOIN $wpdb->postmeta m1
  ON ( $wpdb->posts.ID = m1.post_id )
INNER JOIN $wpdb->postmeta m2   //add this line
ON ( $wpdb->posts.ID = m2.post_id ) //add this line
WHERE
    $wpdb->posts.post_type = 'object'
AND $wpdb->posts.post_status = 'publish'
AND ( m1.meta_key = 'city' AND m1.meta_value = $city_string )
AND ( m2.meta_key = 'type' ) //add this line
GROUP BY $wpdb->posts.ID
ORDER BY m2.meta_value //add this line
DESC;
";

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-18
    • 1970-01-01
    • 2016-08-26
    • 1970-01-01
    • 2015-01-22
    • 1970-01-01
    • 1970-01-01
    • 2018-09-20
    相关资源
    最近更新 更多