Mysql 具有post_where和多个关系键的嵌套元查询

Mysql 具有post_where和多个关系键的嵌套元查询,mysql,custom-post-type,wordpress,Mysql,Custom Post Type,Wordpress,我正在尝试使用添加aWP_查询 将过滤器和WP\u META\u查询发布到wordpress主查询: function example_range_m2( $where ) { $min_price = doubleval($_GET['min-price']); $max_price = doubleval($_GET['max-price']); $query_args = array( 'meta_query' => array( 'relation' =

我正在尝试使用添加aWP_查询 将过滤器和WP\u META\u查询发布到wordpress主查询:

function example_range_m2( $where ) {

$min_price = doubleval($_GET['min-price']);
$max_price = doubleval($_GET['max-price']);

    $query_args = array( 'meta_query' => array(
        'relation' => 'OR',
        array(
            'key' => 'PREFIX_min_property_price_m2',
            'value' => array($min_price, $max_price),
            'type' => 'NUMERIC',
            'compare' => 'BETWEEN'
        ),
        array(
            'key' => 'PREFIX_max_property_price_m2',
            'value' => array($max_price, $min_price),
            'type' => 'NUMERIC',
            'compare' => 'BETWEEN'
        ),
    ) );

    $query_args2 = array('meta_query' => array(
        'relation' => 'AND',
        array(
            'key' => 'PREFIX_min_property_price_m2',
            'value' => $min_price,
            'compare' => '<=',
            'type' => 'NUMERIC'
        ),
        array(
            'key' => 'PREFIX_max_property_price_m2',
            'value' => $max_price,
            'compare' => '>=',
            'type' => 'NUMERIC'
        ),
    ));

$meta_query = new WP_Meta_Query();
$meta_query->parse_query_vars( $query_args );
$mq_sql = $meta_query->get_sql(
    'post',
    $wpdb->posts,
    'ID',
    null
);

$tmp_one = str_replace('mt1', 'example_postmeta', $mq_sql['where']) . ' ';

echo $tmp_one;
$meta_query = new WP_Meta_Query();
$meta_query->parse_query_vars( $query_args2 );
$mq_sql = $meta_query->get_sql(
    'post',
    $wpdb->posts,
    'ID',
    null
);
$tmp_two = str_replace('mt1', 'example_postmeta', $mq_sql['where']) . ' ';
$where .=  $tmp_one . ' OR ' . $tmp_two;

return $where;
}
wordpress主查询的var_dump向我发出以下请求:

SELECT SQL_CALC_FOUND_ROWS example_posts.id
FROM   example_posts
INNER JOIN example_postmeta
ON ( example_posts.id = example_postmeta.post_id )
WHERE
   1 = 1
   AND example_posts.post_type = 'property'
   AND (
         example_posts.post_status = 'publish'
         OR
         example_posts.post_status = 'private'
       )
   AND ( example_postmeta.meta_key = 'PREFIX_min_property_price_m2' )
   AND (
         (
           example_postmeta.meta_key = 'PREFIX_min_property_price_m2'
           AND
           Cast(example_postmeta.meta_value AS signed) BETWEEN '1000' AND '9000'
         )
         OR
         (
           example_postmeta.meta_key = 'PREFIX_max_property_price_m2'
           AND
           Cast(example_postmeta.meta_value AS signed) BETWEEN '9000' AND '1000'
         )
       )
   OR
   And (
         (
           example_postmeta.meta_key = 'PREFIX_min_property_price_m2'
           AND
           Cast(example_postmeta.meta_value AS signed) <= '1000'
         )
         AND
         (
           example_postmeta.meta_key = 'PREFIX_max_property_price_m2'
           AND Cast(example_postmeta.meta_value AS signed) >= '9000'
         )
       )
GROUP  BY example_posts.id
ORDER  BY example_postmeta.meta_value + 0 ASC
LIMIT  0, 4 
为了维护WP和模板逻辑,我需要这个来处理主WP_查询。 我有一个帖子应该和request一起工作,但它就是不能。
如果这不明显的话,我就是一个SQL Noob

好的。在与我自己以及一张纸和一支笔进行了激烈的头脑风暴之后,我明白我可以用完全不同的条件来重新表述我的问题。 我正在尝试编写一个查询,该查询将返回具有满足某个范围的值范围的所有对象。我决定以不同的方式处理最大值和最小值,因此我提出了可以在标准WP_查询中使用的元查询:

这使我能够在比较范围时覆盖所有对象

SELECT SQL_CALC_FOUND_ROWS example_posts.id
FROM   example_posts
INNER JOIN example_postmeta
ON ( example_posts.id = example_postmeta.post_id )
WHERE
   1 = 1
   AND example_posts.post_type = 'property'
   AND (
         example_posts.post_status = 'publish'
         OR
         example_posts.post_status = 'private'
       )
   AND ( example_postmeta.meta_key = 'PREFIX_min_property_price_m2' )
   AND (
         (
           example_postmeta.meta_key = 'PREFIX_min_property_price_m2'
           AND
           Cast(example_postmeta.meta_value AS signed) BETWEEN '1000' AND '9000'
         )
         OR
         (
           example_postmeta.meta_key = 'PREFIX_max_property_price_m2'
           AND
           Cast(example_postmeta.meta_value AS signed) BETWEEN '9000' AND '1000'
         )
       )
   OR
   And (
         (
           example_postmeta.meta_key = 'PREFIX_min_property_price_m2'
           AND
           Cast(example_postmeta.meta_value AS signed) <= '1000'
         )
         AND
         (
           example_postmeta.meta_key = 'PREFIX_max_property_price_m2'
           AND Cast(example_postmeta.meta_value AS signed) >= '9000'
         )
       )
GROUP  BY example_posts.id
ORDER  BY example_postmeta.meta_value + 0 ASC
LIMIT  0, 4 
 /* Logic for Min and Max Price Parameters */
    if( isset($_GET['min-price']) && ($_GET['min-price'] != 'any') && isset($_GET['max-price']) && ($_GET['max-price'] != 'any') ){
        $min_price = doubleval($_GET['min-price']);
        $max_price = doubleval($_GET['max-price']);
        if( $min_price >= 0 && $max_price > $min_price ){

            $meta_query[] = array(
                'key' => 'EXAMPLE_max_property_price_m2',
                'value' => $min_price,
                'type' => 'NUMERIC',
                'compare' => '>='
            );

            $meta_query[] = array(
                'key' => 'EXAMPLE_min_property_price_m2',
                'value' => $max_price,
                'type' => 'NUMERIC',
                'compare' => '<='
            );

        }
    }elseif( isset($_GET['min-price']) && ($_GET['min-price'] != 'any') ){
        $min_price = doubleval($_GET['min-price']);
        if( $min_price > 0 ){
            $meta_query[] = array(
                'key' => 'EXAMPLE_max_property_price_m2',
                'value' => $min_price,
                'type' => 'NUMERIC',
                'compare' => '>='
            );
        }
    }elseif( isset($_GET['max-price']) && ($_GET['max-price'] != 'any') ){
        $max_price = doubleval($_GET['max-price']);
        if( $max_price > 0 ){
            $meta_query[] = array(
                'key' => 'EXAMPLE_min_property_price_m2',
                'value' => $max_price,
                'type' => 'NUMERIC',
                'compare' => '<='
            );
        }
    }