Sql 如何使用$wpdb执行多个和/或元查询

Sql 如何使用$wpdb执行多个和/或元查询,sql,wordpress,Sql,Wordpress,场景:我有一个自定义的帖子类型,开始和结束日期保存为帖子元。这是为了允许管理员安排日期来显示和隐藏帖子。还可以选择将这些日期留空,在这种情况下,默认情况下只显示帖子。由于meta_查询似乎不允许您执行AND/OR比较,因此我尝试了使用$wpdb创建自定义SQL查询。SQL对我来说是一个新领域。目前,这适用于开始日期: $today = date('Y-m-d'); $results = $wpdb->get_results($wpdb->prepare(" SELECT

场景:我有一个自定义的帖子类型,开始和结束日期保存为帖子元。这是为了允许管理员安排日期来显示和隐藏帖子。还可以选择将这些日期留空,在这种情况下,默认情况下只显示帖子。由于
meta_查询
似乎不允许您执行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 = ''))
"));
这将返回一个空数组


问题:我该如何编写此查询来检查
sap\u start\u date
sap\u end\u date
post meta value?

我发现我的问题是,我对同一个meta key对象使用了两次逻辑and;
postmeta.meta_key
怎么能等于
start_date
end_date
?使用来自的答案,我设法重新编写查询以使用别名,这样我可以获得两次
postemta
,并查询两个不同的键:

    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 = ''))
选择
$wpdb->posts.post\u标题,
$wpdb->posts.ID,
$wpdb->posts.post\u内容
从…起
$wpdb->posts,
$wpdb->postmeta作为postmeta1,
$wpdb->postmeta作为postmeta2
哪里
$wpdb->posts.ID=postmeta1.post\u ID
和$wpdb->posts.ID=postmeta2.post\u ID
和$wpdb->posts.post_type='announcements'
和(postmeta1.meta_key='sap_start_date'
和(postmeta1.meta_值='$today'或postmeta2.meta_值='')
这是可行的,尽管我对它的工作原理还不太清楚。如果有人能纯粹出于教育目的进一步阐明这一点,我们将不胜感激

    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 = ''))