如何使用$ wpdb执行多个AND / OR元查询

时间:2014-03-13 20:15:00

标签: sql wordpress wpdb

情景:我有一个自定义帖子类型,其开始日期和结束日期保存为post meta。这是为了允许管理员安排日期以显示和隐藏帖子。还可以选择将这些日期留空,在这种情况下,帖子默认显示。由于meta_query似乎不允许您执行AND / OR比较,我已经涉及使用$ wpdb创建自定义SQL查询。 SQL对我来说是新的领域。目前,这适用于开始日期:

$today = date('Y-m-d');
$results = $wpdb->get_results($wpdb->prepare("
    SELECT
        $wpdb->posts.post_title,
        $wpdb->posts.ID,
        $wpdb->posts.post_content
    FROM
        $wpdb->posts,
        $wpdb->postmeta

    WHERE
        $wpdb->posts.ID = $wpdb->postmeta.post_id
        AND $wpdb->posts.post_type = 'announcements'
        AND ($wpdb->postmeta.meta_key = 'sap_start_date'
            AND ($wpdb->postmeta.meta_value <= '$today' OR $wpdb->postmeta.meta_value = ''))
"));

但是,当我尝试修改以上内容来查询结束日期时,我什么也得不回来。我尝试将WHERE部分更改为:

    WHERE
        $wpdb->posts.ID = $wpdb->postmeta.post_id
        AND $wpdb->posts.post_type = 'announcements'
        AND ($wpdb->postmeta.meta_key = 'sap_start_date'
            AND ($wpdb->postmeta.meta_value <= '$today' OR $wpdb->postmeta.meta_value = ''))
        AND ($wpdb->postmeta.meta_key = 'sap_end_date'
            AND ($wpdb->postmeta.meta_value >= '$today' OR $wpdb->postmeta.meta_value = ''))

这将返回一个空数组。

问题:我如何编写此查询以检查sap_start_datesap_end_date后置元值?

1 个答案:

答案 0 :(得分:1)

我发现我的问题是我使用逻辑AND两次对同一个元密钥对象; postmeta.meta_key如何等于start_date end_date?使用this SO question的答案,我设法重新编写查询以使用别名,这样我就可以获得postmeta两次并查询两个不同的密钥:

    SELECT
        $wpdb->posts.post_title,
        $wpdb->posts.ID,
        $wpdb->posts.post_content
    FROM
        $wpdb->posts,
        $wpdb->postmeta AS postmeta1,
        $wpdb->postmeta AS postmeta2

    WHERE
        $wpdb->posts.ID = postmeta1.post_id
        AND $wpdb->posts.ID = postmeta2.post_id
        AND $wpdb->posts.post_type = 'announcements'
        AND (postmeta1.meta_key = 'sap_start_date'
            AND (postmeta1.meta_value <= '$today' OR postmeta1.meta_value = ''))
        AND (postmeta2.meta_key = 'sap_end_date'
            AND (postmeta2.meta_value >= '$today' OR postmeta2.meta_value = ''))

这很有效,虽然我对 的工作方式仍有点模糊。如果有人能够进一步了解这一点纯粹是出于教育目的,我们将不胜感激。