Mysql如果在GROUP_CONCAT休息
我做一个相当大的SQL,所以我很抱歉,不能提供我的表更大的例子。Mysql如果在GROUP_CONCAT休息
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')
我可以提供更多的例子如果我的解释听起来很混乱。
谢谢。
我是大风扇的group_concat
,但你不需要在这种情况下
sum(if(services.service_code='network', 1, 0)) as networkservice
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 ...)
虽然它会慢很多。
'如果( '网络' IN(GROUP_CONCAT(DISTINCT services.service_code SEPARATOR '\',\ ' ')), 'JA',' NEJ')'应该返回,看起来像'GROUP_CONCAT列表( '1','2','3','4')',无论如何都是这样。但它不起作用。省略group_concat仅适用于'network'是我分组到的行上存在的service_code,并且我无法在service_code上执行Order By。Unquote网络打破了SQL。我没有可能使用SubQuery。感谢您的答复。 – Cleric
将使用下面的代码帮助group_concat
?
IF((GROUP_CONCAT(Direct SEPARATOR ',') REGEXP 'Y'), 'Yes','No') AS Direct
的GROUP_CONCAT
函数返回一个字符串,所以你可以使用FIND_IN_SET
。它采用逗号分隔的字符串作为第二个参数。
IF( FIND_IN_SET ('network', GROUP_CONCAT(DISTINCT services.service_code SEPARATOR ',') ), 'Yes','No') as networkservice
谢谢,从来没有想过使用SUM。我像这样使用IF(sum(if(service.service_code ='network',1,0))> 0,'是','否)作为networkservice',它工作的很好。 – Cleric