Можно ли найти элементы с наиболее распространенными потомками, используя SQL / MySQL?

0

Можно ли использовать 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: найти все максимальные совпадения и отсортировать по этим числам.

  • 0
    Это плохой дизайн базы данных - то, что вы описываете, не является реальным родителем / дочерним отношением, где вы можете неопределенное количество родителей / детей. Практически всегда плохая практика - создавать что-то настолько общее, как таблица entities .
  • 1
    Основная проблема заключается в том, что MySQL не имеет поддержки иерархических запросов.
Показать ещё 1 комментарий
Теги:

1 ответ

0

Я согласен с комментарием 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

Это дает вам основную идею, если вы можете расширить требование:

... найти все максимальное совпадение подсчитывает и сортирует по этим числам

Затем я могу помочь перепроектировать запрос и, при необходимости, дизайн схемы.

  • 0
    не правда ли, что вы всегда можете заменить таблицу Product таблицей сущностей, но просто используйте select ... from ... entity as p ... where entity_type = "Product" вместо select ... from ... product as p ?
  • 0
    В некоторых небольших базах данных вы можете эффективно использовать таблицы EAV, но в каком случае вы хотите? У вас есть отдельные объекты (бренды, категории и продукты), так почему бы не поместить их в свои собственные таблицы? Сущность модели означает, что вы не можете обеспечить целостность данных, и вы в конечном итоге многократно присоединяете таблицу к себе, снижая производительность. Взгляните на эту интересную статью: weblogs.sqlteam.com/davidm/articles/12117.aspx

Ещё вопросы

Сообщество Overcoder
Наверх
Меню