mySql – создание соединения с использованием списка значений, разделенных запятыми

У меня есть таблица с полем для имени и поля Merchant с предоставляемыми ими Сервисами. Поле «Службы» представляет собой список целых чисел, разделенных запятыми, которые относятся к другой таблице «Службы» с полями «Идентификатор службы» и «Имя службы».

Я пытаюсь создать единый запрос, который объединяет эти два, поэтому я могу иметь список Merchants вместе с именами сервисов. Мое решение до сих пор заключалось в том, чтобы сделать второй цикл в моем первом цикле foreach, но это может означать вызовы 5 или 6 дБ для каждого имени Merchant.

После некоторого StackOverflow-ing (google-ing) я заметил, что использование поля, разделенного запятой, вероятно, не самый лучший способ.

У кого-нибудь есть способ сделать это соединение или мысли о том, как лучше настроить структуру db? Спасибо заранее!

Merchant MerchantId Name 1 Adams Consulting Merchant_Services MerchantId Service 1 SEO 1 Brand Consulting 

Фактически вы можете получить список, разделенный запятыми:

 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 

Результаты в:

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

Краткосрочное решение вашей проблемы заключается в использовании функции FIND_IN_SET для присоединения к таблицам MERCHANT и SERVICES:

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

Долгосрочное решение – исправление ваших таблиц – никогда не позволяйте столбцам содержать разделенные запятыми списки ссылочных значений ID / etc.