tostert
September 8, 2020, 9:37am
1
Здравствуйте!
Наверное глупый вопрос задам, так как недавно переехал на мантикор и адаптирую запросы под синтаксис мантикор. Как реализовать запрос вида SELECT * FROM test WHERE floor
!= floor_total
, т.е. значение поля floor не должно равняться полю floor_total, делать поздапросы для каждого из полей не вижу смысла. Задача найти все объекты, кроме объектов, где поля равны, в моем случае “не последний” этаж в доме, когда известен текущий этаж и этажность.
tomat
September 8, 2020, 9:45am
2
вы не можете извлеч контент полнотестовых полей, те прямо сделать field_floor != field_floor_total
нельзя
Вы можете или сравнить длины полей или завести аттрибуты с контектом полей и сравнивать их
можно проиндексировать контент полей в int аттрибут типа SELECT ... crc32(floor) as cmp_floor
+ sql_uint_attr = cmp_floor
можно проиндексировать контент полей в строковый аттрибут и сравнивать строчки
tomat
September 8, 2020, 9:46am
3
tostert:
Задача найти все объекты, кроме объектов, где поля равны, в моем случае “не последний” этаж в доме, когда известен текущий этаж и этажность.
хотя это больше похоже на выражения с аттрибутами - чем на полнотекстовые поля
tostert
September 8, 2020, 9:54am
4
Совершенно верно, типы полей int, мантикор не дает выполнить такую команду. Мантикор в моем случае используется в качестве быстрого индекса, а не для полнотекстового поиска
tomat
September 8, 2020, 11:02am
5
так если floor
и floor_total
это колонки \ аттрибуты то такое должно работать же
SELECT * FROM test WHERE floor<floor_total
tostert
September 8, 2020, 12:23pm
6
к сожалению не работает
нашел тикет на гитхабе Sphinxql: syntax error, unexpected IDENT, expecting CONST_INT or CONST_FLOAT or DOT_NUMBER · Issue #349 · manticoresoftware/manticoresearch · GitHub , я так понимаю данный функционал просто не реализован, ошибка такая же
sphinxql: syntax error, unexpected IDENT, expecting CONST_INT or CONST_FLOAT or DOT_NUMBER or ‘-’ near ‘floor_total’
Решил так, как проверка на 1 и 0:
SELECT id, floor, floor_total, INTEGER(floor = floor_total) as floor_eq FROM test WHERE floor_eq = 0
Sergey
September 9, 2020, 4:44am
7
Или так как-то можно:
mysql> create table test(f text, floor int, floor_total int);
mysql> insert into test(id, floor, floor_total) values(0, 1, 2);
mysql> insert into test(id, floor, floor_total) values(0, 1, 10);
mysql> select abs(floor - floor_total) diff, * from test where diff > 0;
+------+---------------------+-------+-------------+------+
| diff | id | floor | floor_total | f |
+------+---------------------+-------+-------------+------+
| 1 | 5405040262701383681 | 1 | 2 | |
| 9 | 5405040262701383682 | 1 | 10 | |
+------+---------------------+-------+-------------+------+
mysql>