2010-06-25 6 views
5

J'ai une table avec un champ pour le nom et le champ du marchand avec les services qu'ils fournissent. Le champ Services est une liste d'entiers séparés par des virgules qui se rapportent à une autre table Services, avec les champs Service id et Service Name. J'essaye de créer une seule requête qui joint ces deux, ainsi je peux avoir une liste de marchands, avec les noms de services. Ma solution jusqu'ici a été de faire une deuxième boucle dans ma boucle initiale 'foreach', mais cela peut signifier 5 ou 6 appels db pour chaque nom de marchand. Après un certain StackOverflow-ing (google-ing), j'ai remarqué que l'utilisation d'un champ séparé par des virgules n'est probablement pas la meilleure solution.mySql - créer une jointure en utilisant une liste de valeurs séparées par des virgules

Quelqu'un peut-il effectuer une jointure ou réfléchir à la façon de mieux configurer la structure db? Merci d'avance!

Répondre

5
Merchant 
MerchantId Name 
      1 Adams Consulting 

Merchant_Services 
MerchantId Service 
     1 SEO 
     1 Brand Consulting 

Vous pouvez réellement obtenir une liste séparée par des virgules retour:

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 

Résultats dans:

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

C'est parfait. Merci! J'ai une troisième table avec juste une liste de services, mais cela devrait être une jointure assez simple. – TerryMatula

+0

@Marcus Adams La solution est parfaite pour le cas spécifié. Et si nous avions besoin d'un espace après chaque virgule? – Devner

6

La solution à court terme à votre problème est d'utiliser le FIND_IN_SET function pour rejoindre les MARCHANDS et tables SERVICES:

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

La solution à long terme est de corriger vos tables - ne jamais laisser colonnes de contenir séparées par des virgules listes de valeurs de référence/etc.

Questions connexes