Mysql IF IN GROUP_CONCAT перерывы - PullRequest
       9

Mysql IF IN GROUP_CONCAT перерывы

5 голосов
/ 31 августа 2011

Я делаю довольно большой SQL, поэтому я прошу прощения за то, что не могу привести более крупный пример моих таблиц.

SELECT 
customer_id,
agreement_id,
if( 'network' IN ( GROUP_CONCAT( DISTINCT services.service_code
                                 SEPARATOR ',' )  ),
                  'Yes','No') as networkservice
FROM customers
INNER JOIN agreement USING(customer_id)
INNER JOIN services USING(agreement_id)
GROUP BY customer_id

У клиента может быть соглашение, а в соглашении может быть много услуг. Я пытаюсь выяснить, является ли «сеть» одной из услуг в этом соглашении.

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

Если есть только один сервис, и этот сервис является «сетевым», он возвращает «да», но если их больше, он возвращает «Нет».

Если я вместо этого использую (INT) service_id, то это не имеет значения, если только INT, который я ищу, находится первым в списке. Но это только для INT, если «сеть» является первой в списке, она возвращает №

Я пробовал:

if( 'network' IN ( CAST(GROUP_CONCAT( DISTINCT services.service_code
                                      SEPARATOR ' ' ) AS CHAR)  ),
                   'Yes','No')

И

if( 'network' IN ( concat('\'',
                   GROUP_CONCAT(DISTINCT services.service_code
                                SEPARATOR '\', \'' ),
                   '\'') ), 'Yes','No')

Я могу привести больше примеров, если мое объяснение звучит запутанно.

Спасибо.

Ответы [ 4 ]

6 голосов
/ 31 августа 2011

Я большой поклонник из group_concat, но вам не нужно group_concat в этом случае

sum( if(services.service_code='network', 1, 0) ) as networkservice
3 голосов
/ 03 февраля 2016

Функция GROUP_CONCAT возвращает строку, поэтому вы можете использовать FIND_IN_SET. В качестве второго аргумента используется строка, разделенная запятыми.

IF(  FIND_IN_SET ('network', GROUP_CONCAT( DISTINCT services.service_code SEPARATOR ',' )  ), 'Yes','No') as networkservice
1 голос
/ 31 августа 2011

GROUP_CONCAT не работает так, запрос после group_concat выглядит так:

GROUP_CONCAT('1,2,3,4') 

и чтобы это работало, это должно выглядеть так:

GROUP_CONCAT('1', '2', '3', '4')

Вместо этого попробуйте опустить group_concat: (обратите внимание, что без кавычек network)

if(network IN (DISTINCT services.service_code) ), 'Yes','No')

Если это не сработает, попробуйте с помощью дополнительного выбора:

if(network IN (SELECT service_code FROM services WHERE ...)

хотя это будет намного медленнее.

0 голосов
/ 15 сентября 2015

Поможет ли использование приведенного ниже кода?

IF((GROUP_CONCAT(Direct SEPARATOR ',' ) REGEXP 'Y' ), 'Yes','No') AS Direct
...