У меня есть таблица с полем для имени Продавца и полем с Услугами, которые они предоставляют. Поле Services является списком разделенных запятой значений целых чисел, которые касаются другой таблицы Services с Сервисным идентификатором и Сервисными Полями имени.
Я пытаюсь создать единый запрос, который присоединяется к тем двум, таким образом, у меня может быть список Продавцов, наряду с Сервисными Названиями. Мое решение до сих пор состояло в том, чтобы сделать второй цикл в моей начальной букве 'foreach' цикл, но это может означать призывы на 5 или 6 дб к каждому Торговому имени.
После некоторого StackOverflow-луга (луг Google) я заметил, что использование запятой отделилось, поле является, вероятно, не лучшим способом пойти.
У кого-либо есть или способ сделать соединение или мысли о том, как структура дб могла быть настроена лучше?Заранее большое спасибо!
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
Долгосрочное решение - исправить ваши таблицы - никогда не позволяйте столбцам содержать разделенные запятыми списки значений ссылочных идентификаторов и т. д.