2011-08-31 208 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