2011-08-31 148 views
5

我做一个相当大的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') 

我可以提供更多的例子如果我的解释听起来很混乱。

谢谢。

回答

5

我是大风扇的group_concat,但你不需要在这种情况下

sum(if(services.service_code='network', 1, 0)) as networkservice 
+0

谢谢,从来没有想过使用SUM。我像这样使用IF(sum(if(service.service_code ='network',1,0))> 0,'是','否)作为networkservice',它工作的很好。 – Cleric

1

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

'如果( '网络' 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

0

将使用下面的代码帮助group_concat

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

GROUP_CONCAT函数返回一个字符串,所以你可以使用FIND_IN_SET。它采用逗号分隔的字符串作为第二个参数。

IF( FIND_IN_SET ('network', GROUP_CONCAT(DISTINCT services.service_code SEPARATOR ',') ), 'Yes','No') as networkservice