2010-06-25 17 views
5

Tengo una tabla con un campo para el nombre y el campo del Comerciante con los Servicios que brindan. El campo Servicios es una lista de enteros separados por comas que se relacionan con otra tabla de Servicios, con los campos Id de servicio y Nombre de servicio.mySql: crear una unión utilizando una lista de valores separados por comas

Estoy tratando de crear una sola consulta que se una a esas dos, para poder tener una lista de comerciantes, junto con los nombres de los servicios. Mi solución hasta ahora ha sido hacer un segundo ciclo dentro de mi bucle 'foreach' inicial, pero eso puede significar 5 o 6 llamadas a base de datos por cada nombre de comerciante.

Después de algunos StackOverflow-ing (google-ing), noté que usar un campo separado por comas probablemente no sea el mejor camino a seguir.

¿Alguien tiene alguna manera de hacer la unión, o ideas sobre cómo la estructura db podría configurarse mejor? ¡Muchas gracias de antemano!

Respuesta

5
Merchant 
MerchantId Name 
      1 Adams Consulting 

Merchant_Services 
MerchantId Service 
     1 SEO 
     1 Brand Consulting 

En realidad se puede obtener una lista separada por comas de vuelta:

SELECT m.*, GROUP_CONCAT(ms.Service) AS Services 
FROM Merchant m 
LEFT JOIN Merchant_Serivces ms 
ON ms.MerchantId = m.MerchantId 
GROUP BY m.MerchantId 
ORDER BY m.Name, ms.Service 

Resultados: en

MerchantID Name    Services 
---------- ---------------- -------------------- 
     1 Adams Consulting Brand Consulting,SEO 
+0

Esto es perfecto. ¡Gracias! Tengo una tercera tabla con solo una lista de Servicios, pero debería ser una unión bastante simple. – TerryMatula

+0

@Marcus Adams La solución es perfecta para el caso específico. ¿Qué pasa si necesitamos un espacio después de cada coma? – Devner

6

La solución a corto plazo para el problema es utilizar el FIND_IN_SET function para unirse a las Tiendas y Servicios tablas:

SELECT * 
    FROM MERCHANT m 
    JOIN SERVICES s ON FIND_IN_SET(s.service_id, m.services) > 0 

La solución a largo plazo es corregir las tablas - nunca permita columnas para contener separados por comas listas de valores referenciales de ID/etc.

Cuestiones relacionadas