Explication de l'opérateur de comparaison Meta_query

37

J'ai remarqué qu'il y a beaucoup d'opérateurs qui peuvent être utilisés pour comparer dans meta_query. Cependant, je ne suis pas tout à fait sûr de ce que je devrais utiliser l' opérateur, il est source de confusion en quelque sorte comme =et l' LIKEopérateur.

J'aimerais savoir ce que chaque opérateur veut dire exactement et dans quel état je devrais les utiliser.

=
!=
>
>=
<
<=
LIKE
NOT LIKE
IN
NOT IN
BETWEEN
NOT BETWEEN
NOT EXISTS

Merci.

dev-jim
la source

Réponses:

50

Les premiers travaux sur ce que vous attendez:

=   equals
!=  does not equal
>   greater than
>=  greater than or equal to
<   less than
<=  less than or equal to

LIKEet NOT LIKEsont des opérateurs SQL qui vous permettent d'ajouter des symboles génériques, vous pouvez donc avoir une méta-requête qui ressemble à ceci:

array( 
    'key' => 'name', 
    'value' => 'Pat', 
    'compare' => 'LIKE'
)

Cela renverrait toutes les publications où la méta valeur "name" a la chaîne "Pat". Dans ce cas, "Pat" "Patricia" et "Patrick" vous seraient tous renvoyés. Il y a une explication de tutoriel non-WordPress ici .

L'ajout du caractère générique %n'est pas nécessaire, car il est ajouté par défaut, comme @Herb a déclaré dans sa réponse ci-dessous . Comme ceci: $meta_value = '%' . like_escape( $meta_value ) . '%';- voir la source .

INet NOT INsélectionnez toutes les correspondances qui sont dans (ou pas dans) le tableau donné. Donc, vous pourriez faire quelque chose comme ça:

array(
    'key'     => 'color', 
    'value'   => array('red', 'green', 'blue') 
    'compare' => 'IN'
)

et tous les articles dont la couleur est définie sur le rouge, le vert ou le bleu sont affichés. L'utilisation de 'NOT IN' obtient l'inverse, toute publication dont la valeur est définie sur autre chose que ce qui est dans le tableau.

Le SQL généré pour cela ressemblerait à ceci:

SELECT * FROM posts_meta WHERE value IN ("red", "green", "blue") 

BETWEENet NOT BETWEENvous permettent de définir une plage de valeurs qui pourrait être correcte, et vous obliger à donner deux valeurs dans un tableau dans votre meta_query:

array( 
    'key' => 'price', 
    'value' => array(20,30) 
    'compare' => 'BETWEEN'
)

Cela vous donnera tous les messages dont le prix est compris entre 20 et 30. Cette personne creuse dans un exemple avec des dates.

NOT EXISTSest juste comme ce que ça sonne - la méta-valeur n'est pas définie ou est définie sur une valeur nulle. Tout ce dont vous avez besoin pour cette requête est la clé et l'opérateur de comparaison:

array( 
    'key' => 'price', 
    'compare' => 'NOT EXISTS'
)

Cette personne avait besoin d'interroger des méta-valeurs inexistantes et avait besoin qu'elles jouent bien avec les autres.

J'espère que cela t'aides!

Jen
la source
Remarque: Si vous utilisez meta_queryarray, vos clés ne doivent pas être préfixées avec meta_. Si vous utilisez $query->meta_key, $query->meta_valueetc., ils devraient toujours conserver le préfixe.
Sean
Je n'arrive pas à trouver une explication sur ce que fait l'option de comparaison "IN". Une idée de comment ça marche?
Joe
1
@ Joe, je ne sais pas pourquoi je n'ai rien ajouté à propos de "IN" et "NOT IN". J'ai édité et mis à jour la réponse avec ces comparaisons.
Jen
7

Notez que lorsque vous utilisez une valeur meta_compare de 'LIKE', WordPress enveloppe automatiquement le caractère générique (%) autour de la chaîne meta_value. Ainsi, l'exemple 'Pat%' pourrait ne pas renvoyer de résultats.

bobbingwide
la source
y a-t-il des informations à ce sujet dans les documents quelque part Herb? L’exemple devrait-il changer pour supprimer le %?
Jen
Cela devrait, je l'ai fait en ce moment, voir la source , puis il devient très clair que Herb a raison. @guiniveretoo
Nicolai