Нужно ли минимизировать этот SQL-запрос для отношения категории / продукта? - PullRequest
0 голосов
/ 15 июля 2011

У меня есть структура таблицы следующим образом, и я хочу выбрать все активные категории с активными продуктами определенного родительского идентификатора.

Поэтому, если я подключу конкретный parentID, я получу только соответствующие активные подкатегории родительского объекта, содержащие активные продукты.

Это мой sql (mysql), который пока работает, но выглядит довольно неприятно, и ради академии я хочу знать, есть ли лучший способ. Мне кажется, что выбор всех идентификаторов productID, которые активны для фильтрации результатов, - это пустая трата времени, но я не могу найти способ обойти это, или MySQL найдет лучший способ обработать этот запрос?

(many-to-many upon itself)
categories
----------
categoryID
parentID
name
isActive (bool)

(linker table between categories and product)
productCategories
-----------------
productID
categoryID

products
--------
productID
name
isActive (bool)


SELECT productCategories.categoryID, categories.* FROM productCategories
                LEFT JOIN categories ON
                    productCategories.categoryID = categories.categoryID
                WHERE 
                    productCategories.categoryID IN 
                    (SELECT categoryID FROM categories WHERE parentID = {$parentID} AND isActive = 1)
                    AND
                    productCategories.productID IN
                    (SELECT productID FROM products WHERE isActive = 1)
                GROUP BY productCategories.categoryID

1 Ответ

2 голосов
/ 15 июля 2011

Альтернативный макет может быть следующим ...

SELECT
  *
FROM
(
  SELECT
    productCategories.categoryID
  FROM
    productCategories
  INNER JOIN
    categories
      ON categories.categoryID = productCategories.parentID
  INNER JOIN
    products
      ON products.productID    = productCategories.productID
  WHERE 
    categories.parentID = {$parentID}
    AND categories.isActive = 1
    AND products.isActive = 1
  GROUP BY
    productCategories.categoryID
)
  AS category_map
LEFT JOIN
  categories AS [children]
    ON category_map.categoryID = categories.categoryID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...