web-dev-qa-db-fra.com

Requête imbriquée dans l'exploitant OR ne fonctionne pas dans meta_query

Cela fait des heures que j'essaye, j'ai cherché et je n'ai pas la moindre idée. J'essaie de créer une requête imbriquée avec l'opérateur OR comme parent et l'opérateur AND à l'intérieur comme enfant. La page continue à se charger et les résultats ne sont pas affichés. Par contre, si je fais AND en tant que parent, alors cela fonctionne. Voici mon code:

$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;
3
Safi Mustafa

Je peux voir de la requête ci-dessus que vous êtes prêt à faire la chose suivante.

Obtenez tous les messages si property_size est 15 ET property-type est marla OR Kanal.

Le SQL sera like %marla% OR like %Kanal% cela équivaut à like %marla Kanal% cela ne fera pas beaucoup de différence (je suppose)

Ainsi, vous pouvez réduire cette requête de cette façon

$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'
    )
);

Dans mes tests, il réduit le temps de requête de 428 ms

SQL like est coûteux, donc si vous faites correspondre la valeur exacte, utilisez IN avec un tableau de valeurs.

array(
        'key'       => 'property-type',
        'value'     =>  array('marla', 'Kanal'),
        'type'      => 'CHAR',
        'compare'   => 'IN'
    )
1
Sumit