Pull to refresh

Реализация условия «ИЛИ» в SphinxQL

Reading time1 min
Views10K
SQL-подобный язык SphinxQL пока не поддерживает условие «OR» в выражении «WHERE». То есть при запросе к поисковому индексу нельзя написать нечто вроде

SELECT * FROM `goods_index` WHERE `price` > 100 OR `price` = 0;
выбрать из индекса все товары, с ценой большее 100 тугриков или если цена не указана

Но выходы, конечно, есть: использовать вычисления. Перепишем запрос для придуманного мною примера в таком виде:

SELECT *, IF(`price` > 100, 1, 0) + IF(`price` = 0, 1, 0) AS `pricematch` FROM `goods_index` WHERE `pricematch` = 1;

Фокус в том, что pricematch всегда будет равен единице, если цена выше 100 или равна нулю и для проверки соответствия записи достаточно проверить равенство pricematch единице.

Используя такие вычисления в запросах SphinxQL и традиционного SQL, можно выйти из положения в других ситуациях, когда в запросе необходимо условие «или».

update.

artifex в комментариях приводит намного более прозрачный и удобочитаемый вариант c использованием OR в выражении SELECT:

SELECT *, (`price` > 100 OR `price` = 0) AS `pricematch` FROM `goods_index` WHERE `pricematch` > 0;


update 2.

Столкнулся с проблемой: индексируемый атрибут в БД имеет тип BIGINT. В конфиге Sphinx описан как
sql_attr_bigint = myattr


При этом вот такой запрос не дает нужного результата, возвращая empty set:

SELECT * FROM index WHERE myattr > 87124599823547;


Как и с условием «или» помог перенос выражения в секцию SELECT:

SELECT *, ( myattr > 87124599823547 ) AS attrmatch FROM index WHERE attrmatch = 1;
Tags:
Hubs:
Total votes 21: ↑18 and ↓3+15
Comments12

Articles