Объяснение операторов сравнения meta_query

29 окт. 2012 г., 19:47:40
Просмотры: 182K
Голосов: 63

Я заметил, что существует множество операторов, которые можно использовать для сравнения в meta_query. Однако я не совсем уверен, какой оператор следует использовать, иногда это вызывает путаницу, например, операторы = и LIKE.

Я хотел бы узнать, что точно означает каждый оператор и в каких случаях их следует использовать.

=           // Точное совпадение
!=          // Не равно
>           // Больше чем
>=          // Больше или равно
<           // Меньше чем
<=          // Меньше или равно
LIKE        // Частичное совпадение текста
NOT LIKE    // Исключение частичного совпадения
IN          // Значение находится в массиве
NOT IN      // Значение не находится в массиве
BETWEEN     // Значение находится между двумя числами
NOT BETWEEN // Значение не находится между двумя числами
NOT EXISTS  // Метаполе не существует

Спасибо.

0
Все ответы на вопрос 2
5
103

Первые несколько операторов работают так, как вы ожидаете:

=   равно
!=  не равно
>   больше чем
>=  больше или равно
<   меньше чем
<=  меньше или равно



LIKE и NOT LIKE

LIKE и NOT LIKE — это SQL-операторы, которые позволяют использовать подстановочные символы, поэтому вы можете создать мета-запрос, который выглядит так:

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

Это вернет все записи, где мета-значение "name" содержит строку "Pat". В этом случае будут возвращены записи с "Pat", "Patricia" и "Patrick". Подробное объяснение (не связанное с WordPress) можно найти здесь.

Добавлять подстановочный символ % не обязательно, так как он добавляется по умолчанию, как упомянул @Herb в своем ответе. Вот так: $meta_value = '%' . like_escape( $meta_value ) . '%'; — см. источник.



IN и NOT IN

IN и NOT IN выбирают совпадения, которые находятся (или не находятся) в заданном массиве. Например, можно сделать так:

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

Это вернет все записи, где цвет установлен в red, green или blue. Использование 'NOT IN' даст обратный результат — любые записи, у которых значение отличается от указанных в массиве.

Сгенерированный SQL для этого запроса будет выглядеть примерно так:

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



BETWEEN и NOT BETWEEN

BETWEEN и NOT BETWEEN позволяют определить диапазон допустимых значений и требуют указания двух значений в массиве внутри meta_query:

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

Это вернет все записи, где цена находится в диапазоне от 20 до 30. Здесь можно найти пример с датами.



NOT EXISTS

NOT EXISTS работает так, как звучит — мета-значение не установлено или равно null. Для такого запроса нужны только ключ и оператор сравнения:

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

Вот пример, где нужно было запросить отсутствующие мета-значения и интегрировать их с другими запросами.

Надеюсь, это поможет!

29 окт. 2012 г. 20:48:22
Комментарии

Примечание: Если вы используете массив meta_query, ваши ключи не должны содержать префикс meta_. Если вы используете $query->meta_key, $query->meta_value и т.д., то эти префиксы должны оставаться.

Sean Sean
20 авг. 2014 г. 17:25:09

Не могу найти объяснение, что делает опция сравнения "IN". Кто-нибудь знает, как это работает?

Joe Joe
9 мар. 2015 г. 16:50:07

@Joe, не знаю, почему я не добавил ничего про "IN" и "NOT IN". Я отредактировал и обновил ответ с этими вариантами сравнений.

Jen Jen
9 мар. 2015 г. 18:05:40

Это отличный ответ, но сейчас доступно ещё несколько вариантов: https://codex.wordpress.org/Class_Reference/WP_Meta_Query

noelmcg noelmcg
28 авг. 2020 г. 13:38:24

'EXISTS' , 'REGEXP', 'NOT REGEXP' и 'RLIKE'

noelmcg noelmcg
28 авг. 2020 г. 13:39:17
2
13

Обратите внимание, что при использовании значения meta_compare 'LIKE' WordPress автоматически добавляет символ подстановки (%) вокруг строки meta_value. Таким образом, пример 'Pat%' может не вернуть никаких результатов.

13 окт. 2013 г. 23:13:00
Комментарии

есть ли информация об этом в документации где-нибудь, Herb? Следует ли изменить пример, убрав %?

Jen Jen
22 нояб. 2013 г. 17:47:01

Да, следует, я как раз сейчас это сделал, посмотрите исходный код, тогда становится совершенно ясно, что Herb прав. @guiniveretoo

Nicolai Grossherr Nicolai Grossherr
8 апр. 2014 г. 18:10:49