Условия IF() в select либо в where

Народ, подскажите, как правильно написать запросы с IF() чтобы получилось примерно такое:
select id, if(group_id > 0, 1, 0) as hasGroup from products where hasGroup > 0;
select id from products where if(group_id > 0, 1, 0) > 0;

Данные:
MySQL [(none)]> select id, group_id from products limit 4;
±------±---------+
| id | group_id |
±------±---------+
| 28934 | 84 |
| 28955 | 105 |
| 28956 | 299 |
| 28957 | 107 |

Вы же сами написали уже:

MySQL [(none)]> select * from products;
+-------+----------+------+
| id    | group_id | f    |
+-------+----------+------+
| 28934 |       84 |      |
| 28945 |        0 |      |
| 28955 |      105 |      |
| 28956 |      299 |      |
| 28957 |      107 |      |
+-------+----------+------+
MySQL [(none)]> select id, if(group_id > 0, 1, 0) as hasGroup from products where hasGroup > 0;
+-------+----------+
| id    | hasgroup |
+-------+----------+
| 28934 |        1 |
| 28955 |        1 |
| 28956 |        1 |
| 28957 |        1 |
+-------+----------+
1 Like

Именно так и думал, но почему-то не работает:

MySQL [(none)]> select id, group_id from products limit 4;
+-------+----------+
| id    | group_id |
+-------+----------+
| 28934 |       84 |
| 28955 |      105 |
| 28956 |      299 |
| 28957 |      107 |
+-------+----------+
4 rows in set (0.000 sec)

MySQL [(none)]> select id, if(group_id > 0, 1, 0) as hasGroup from products where hasGroup > 0;
ERROR 1064 (42000): index products: parse error: Sphinx expr: syntax error, unexpected '(', `expecting $end near '(group_id > 0, 1, 0)'`

Your MySQL connection id is 54
Server version: 3.5.0 1d34c491@200722 release git branch HEAD (no branch)
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others

Очень странно. А может сделать вот конкретно так?

MySQL [(none)]> create table products2 (f text, group_id int);
MySQL [(none)]> insert into products2(id,group_id) values(28934,84),(28945,0),(28955,105),(28956,299),(28957,107);
MySQL [(none)]> select id, if(group_id > 0, 1, 0) as hasGroup from products2 where hasGroup > 0;
+-------+----------+
| id    | hasgroup |
+-------+----------+
| 28934 |        1 |
| 28955 |        1 |
| 28956 |        1 |
| 28957 |        1 |
+-------+----------+

И покажите свой конфиг.

Я пытаюсь поднять поисковый сервис который работает на Sphinx 3, на мантикор
Конфигурация слишком большая, поэтому вынес её в пасту https://pastebin.com/SVh9jgHB

Команды create table products2 (f text, group_id int); не проходят. Ошибка: ERROR 1064 (42000): CREATE TABLE requires data_dir to be set in the config file

Если в конфигурацию добавляю настройку data_dir = /var/manticore, то сервер не запускается, ошибка: [47:42.797] [101] using config file '/app/etc/base.conf' (8328 chars)... [47:42.798] [101] FATAL: 'data_dir' cannot be mixed with index declarations in '/app/etc/base.conf'

Что-то непонятно куда капать

Read about plain mode vs rt mode - https://manual.manticoresearch.com/Read_this_first#Real-time-mode-vs-plain-mode

1 Like

Сделал отдельный конфиг для RT:
www-data@c0156d1d51c1:/app/etc$ cat rt.conf
indexer
{
mem_limit = 2047M
}

searchd
{
    listen = 9366:mysql41
    log = /app/pid/rt.log
    pid_file = /app/pid/rt.pid
    query_log = /app/logs/rt-query.log
    query_log_format = sphinxql
    binlog_path =
    dist_threads = 4
    data_dir = /app/data
}
www-data@c0156d1d51c1:/app/etc

Всё работает здесь так же как и у Вас.
Но, почему-то на обычном PLAIN не работает. В документации не увидел ограничений или не туда смотрел?

тогда какой тип у group_id?
вывод команды desc products

1 Like

Спасибо. Совсем забыл, в индексе есть такое поле if (interval_float) для поиска.
Переименовал и всё заработало.

А можно подробнее, как это выглядело? По идее поля с именем типа if не должны создаваться:

mysql> create table t(f text, if text);
ERROR 1064 (42000): sphinxql: syntax error, unexpected IF, expecting IDENT or TYPE near 'if text)'

И что такое interval_float?

В конфигурации индекса было объявлено поле csvpipe_attr_json = if (в другом индексе sql_attr_json = if) и оно работало нормально.

Спасибо, проверим.

У нас так хранятся интервальные вещественные атрибуты.

Так а откуда этот тип поля? В Sphinx/Manticore же нет такого.

По возможности прошу рассмотреть поддержку функции coalesce().

Это не тип. Я дал расшифровку сокращения if)

ОК, понятно

1 Like