Можно ли использовать SQL для поиска всех брендов, которые имеют наиболее распространенные категории?
Например, марка "Dove" может иметь категорию мыла, ухода за кожей, шампуня Это найти все бренды, которые имеют самые подходящие категории, другими словами, самые похожие бренды.
Это можно сделать программным путем с помощью Ruby или PHP: просто возьмите бренд и пропустите все остальные бренды, и посмотрите, сколько совпадающих категорий есть, и сортируйте по нему. Но если есть 2000 брендов, тогда на бренд должно быть 2000 запросов. (если мы не предварительно кэшируем все результаты запроса 2000, поэтому для всех марок 2000 мы повторно используем эти результаты)
Может ли это быть выполнено SQL/MySQL по 1 запросу?
Скажем, таблица имеет:
entities
--------
id
type = brand or category or product
name
entities_parent_child
--------------------
parent_id
child_id
в приведенной выше таблице есть запись для каждого родителя = бренд и child = product, а также запись для каждого родителя = категория и child = product, поэтому бренд должен относиться к категории по продуктам.
Я думаю, что трудная часть для SQL: найти все максимальные совпадения и отсортировать по этим числам.
Я согласен с комментарием wuputah. Для этой проблемы таблица "сущности" не является ответом. Вы дали себе намек, что дизайн неправильный, когда вы говорите, что не можете сформировать запрос, чтобы получить нужные ответы.
Создайте правильную иерархию для ваших данных, с отдельными таблицами для отдельных объектов реального слова, ваш будет:
[Brands]
[Categories]
[Products]
Если вам нужна помощь в определении деревьев и иерархий в SQL, я предлагаю вам взять копию Celko Деревья и иерархии в SQL для Smarties.
SQL не имеет понятия полиморфизма, поэтому не пытайтесь создать базу данных в соответствии с вашим языком программирования. Базы данных работают с наборами, поэтому думайте в наборах.
Чтобы найти похожие бренды, присоединитесь к своим таблицам и используйте группировку:
SELECT Brands.brand_name, COUNT(Categores.category_name) as category_count
FROM Brands INNER JOIN Categories
ON Brands.brand_name = Categories.brand_name
GROUP BY Brands.brand_name
ORDER BY Brands.brand_name, COUNT(Categores.category_name) -- add DESC if you want largest count at the top
Это дает вам основную идею, если вы можете расширить требование:
... найти все максимальное совпадение подсчитывает и сортирует по этим числам
Затем я могу помочь перепроектировать запрос и, при необходимости, дизайн схемы.
select ... from ... entity as p ... where entity_type = "Product"
вместо select ... from ... product as p
?
entities
.