2011-08-31 26 views
5

Im haciendo un SQL bastante grande, así que me disculpo que no puede proporcionar un mayor ejemplo de mis tablas.Mysql IF IN GROUP_CONCAT breaks

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 

Un cliente puede tener un acuerdo y un acuerdo puede tener muchos servicios. Lo que estoy tratando de averiguar es si 'red' es uno de los servicios en ese acuerdo.

Dado que GROUP_CONCAT devuelve una lista separada por comas, se siente perfecto para mi caso. Pero no puedo hacer que funcione y me estoy quedando sin ideas.

Si sólo hay un servicio y que el servicio es 'red' que devuelve sí, pero si hay más de uno se vuelve Nº

Si uso (INT) service_id lugar no hace ninguna diferencia, a menos que el INT Estoy buscando es el primero en la lista. Pero eso es solamente para INT, si la 'red' es el primero en la lista vuelve Nº

He intentado:

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

Y

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

puedo proporcionar más ejemplos si mi explicación suena confusa

Gracias.

Respuesta

5

Soy un gran fan de group_concat, pero que no requieren group_concat en este caso

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

Gracias, nunca pensé en usar SUM. Lo usé así 'IF (sum (if (service.service_code = 'network', 1, 0))> 0, 'Yes', 'No) como networkservice' y funciona muy bien. – Cleric

1

GROUP_CONCAT no funciona de esta manera, la consulta después de GROUP_CONCAT se parece a esto:

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

y para que esto funcione, tendría que tener este aspecto:

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

En cambio, ommitting tratar la GROUP_CONCAT: (nótese el unquoted network)

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

Si esto no funciona, pruebe con un sub-select:

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

aunque será mucho más lento.

+0

'si ('red' EN (GROUP_CONCAT (DISTINCT services.service_code SEPARADOR '\', \ ' ')), 'Ja',' Nej')' debe devolver una lista como la 'GROUP_CONCAT ('1', '2', '3', '4') ', se siente de esa manera de todos modos. Pero no funciona. Omitir group_concat solo funciona si 'network' es el service_code presente en la fila a la que estoy agrupando, y no puedo hacer Order By en service_code.Unquote networks rompe el sql. Y no tengo la posibilidad de usar un SubQuery. Gracias por su respuesta. – Cleric

0

¿El uso de la ayuda código de abajo?

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

La función GROUP_CONCAT devuelve una cadena, por lo que puede utilizar FIND_IN_SET. Toma una secuencia separada por comas como un segundo argumento.

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