2011-08-31 58 views
5

Im đang thực hiện một SQL khá lớn vì vậy tôi xin lỗi vì không thể cung cấp ví dụ lớn hơn về các bảng của tôi.Mysql IF IN GROUP_CONCAT ngắt

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 

Khách hàng có thể thỏa thuận và thỏa thuận có thể có nhiều dịch vụ. Những gì tôi đang cố gắng để tìm hiểu là nếu 'mạng' là một trong những dịch vụ trong thỏa thuận đó.

Vì GROUP_CONCAT trả về danh sách được phân cách bằng dấu phẩy, nên nó hoàn toàn phù hợp với trường hợp của tôi. Nhưng tôi không thể làm cho nó hoạt động và tôi hết ý tưởng.

Nếu chỉ có một dịch vụ và dịch vụ đó là 'mạng' nó sẽ trả về có, nhưng nếu có nhiều hơn thì một trong nó sẽ trả về số

Nếu tôi sử dụng (INT) service_id thay vào đó nó làm cho không có sự khác biệt, trừ khi INT Im đang tìm kiếm đầu tiên trong danh sách. Nhưng thats chỉ cho INT, nếu 'mạng' là lần đầu tiên trong danh sách nó sẽ trả về số

Tôi đã thử:

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') 

tôi có thể cung cấp thêm ví dụ nếu lời giải thích của tôi có vẻ khó hiểu.

Cảm ơn.

Trả lời

5

Tôi là một fan hâm mộ lớn của group_concat, nhưng bạn không cần group_concat trong trường hợp này

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

Xin cảm ơn, đừng bao giờ nghĩ đến việc sử dụng SUM. Tôi đã sử dụng nó như thế này 'NẾU (tổng (nếu (service.service_code = 'mạng', 1, 0))> 0, 'Có', 'Không' là dịch vụ mạng' và nó hoạt động tốt. – Cleric

1

GROUP_CONCAT không hoạt động như thế này, truy vấn sau group_concat trông như thế này:

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

và để làm việc này, nó sẽ phải trông như thế này:

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

Thay vào đó, thử ommitting nhóm_concat: (lưu ý unquoted network)

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

Nếu cách này không hiệu quả, hãy thử với một lựa chọn phụ:

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

mặc dù nó sẽ chậm hơn nhiều.

+0

'nếu ('mạng' IN (GROUP_CONCAT (DISTINCT services.service_code SEPARATOR '\', \ ' ')), 'Ja',' Nej')' nên trả về một danh sách giống như 'GROUP_CONCAT ('1', '2', '3', '4') ', dù sao cũng vậy. Nhưng nó không hoạt động. Bỏ qua group_concat chỉ hoạt động nếu 'network' là service_code hiện tại trên hàng mà Im grouping to, và tôi không thể làm Order By trên service_code.Unquote mạng phá vỡ sql. Và tôi không có khả năng sử dụng SubQuery. Cám ơn phản hồi của bạn. – Cleric

0

sẽ sử dụng mã trợ giúp dưới đây?

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

Các GROUP_CONCAT hàm trả về một chuỗi, vì vậy bạn có thể sử dụng FIND_IN_SET. Nó lấy một chuỗi được phân tách bằng dấu phẩy làm đối số thứ hai.

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