Consulta aninhada dentro do operador lógico OU não funcionando em meta_query

4

Eu tenho tentado isso há horas e tenho procurado e não tenho a menor idéia. Estou tentando fazer uma consulta aninhada com o operador OR como pai e com o operador AND dentro dele como filho. A página continua carregando e os resultados não são mostrados. Enquanto, por outro lado, se eu fizer AND como pai, então funciona. Aqui está o meu código:

$compare_array = array(
    'relation' => 'OR',
    array(
        'relation' => 'AND',
        array(
            'key'       => 'property_size',
            'value'     => '15',
            'type'      => 'numeric',
            'compare'   => '='
        ),
        array(
            'key'       => 'property-type',
            'value'     => 'marla',
            'type'      => 'CHAR',
            'compare'   => 'LIKE'
        )
    ),
    array(
        'relation' => 'AND',
        array(
            'key'       => 'property_size',
            'value'     => '15',
            'type'      => 'numeric',
            'compare'   => '='
        ),
        array(
            'key'       => 'property-type',
            'value'     => 'Kanal',
            'type'      => 'CHAR',
            'compare'   => 'LIKE'
        )
    )

);

$meta_query[] = $compare_array;
    
por Safi Mustafa 14.03.2016 / 15:08

1 resposta

2

Eu posso ver na consulta acima que você está disposto a fazer o seguinte.

Obter todas as postagens se property_size for 15 AND property-type for marla OU Kanal .

O SQL será like %marla% OR like %Kanal% isto é equivalente a like %marla Kanal% isto não fará muita diferença (suponho)

Assim, você pode minimizar essa consulta dessa maneira

$compare_array = array(
    'relation' => 'AND',
    array(
        'key'       => 'property_size',
        'value'     => '15',
        'type'      => 'numeric',
        'compare'   => '='
    ),
    array(
        'key'       => 'property-type',
        'value'     => 'marla Kanal',
        'type'      => 'CHAR',
        'compare'   => 'LIKE'
    )
);

Nos meus testes, reduz o tempo de consulta em 428 ms

O SQL like é caro, portanto, se você estiver correspondendo ao valor exato, use IN com a matriz de valores.

array(
        'key'       => 'property-type',
        'value'     =>  array('marla', 'Kanal'),
        'type'      => 'CHAR',
        'compare'   => 'IN'
    )
    
por Sumit 14.03.2016 / 17:58