У меня есть таблица с полем для имени и поля 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.