2010-06-25 12 views
5

Ho una tabella con un campo per il nome e il campo del commerciante con i servizi forniti. Il campo Servizi è un elenco separato da virgole di numeri interi che si riferiscono a un'altra tabella Servizi, con l'ID servizio e i campi Nome servizio.mySql - creazione di un join utilizzando un elenco di valori separati da virgola

Sto provando a creare una singola query che unisce questi due, quindi posso avere un elenco di commercianti, insieme ai nomi dei servizi. La mia soluzione finora è stata quella di fare un secondo ciclo nel mio ciclo iniziale "foreach", ma ciò può significare 5 o 6 chiamate db per ogni nome del commerciante.

Dopo alcuni StackOverflowing (google-ing), ho notato che l'utilizzo di un campo separato da virgola non è probabilmente il modo migliore per andare.

Chiunque ha un modo per partecipare, o pensa a come la struttura DB può essere impostata meglio? Molte grazie in anticipo!

risposta

5
Merchant 
MerchantId Name 
      1 Adams Consulting 

Merchant_Services 
MerchantId Service 
     1 SEO 
     1 Brand Consulting 

Si può effettivamente ottenere un elenco separato da virgole di nuovo:

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 

Risultati in:

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

Questo è perfetto. Grazie! Ho una terza tabella con solo un elenco di servizi, ma dovrebbe essere un join abbastanza semplice. – TerryMatula

+0

@Marcus Adams La soluzione è perfetta per il caso specificato. Cosa succede se abbiamo bisogno di uno spazio dopo ogni virgola? – Devner

6

La soluzione a breve termine per il problema è quello di utilizzare il FIND_IN_SET function di aderire il commerciante e servizi tabelle:

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

La soluzione a lungo termine è quello di correggere le tabelle - mai permettere colonne di contenere separati da virgola liste di ID referenziale/valori ecc.

Problemi correlati