Как я могу сделать запрос, выбирая только КАТЕГОРИИ, в которых есть ПРОДУКТЫ? - PullRequest
1 голос
/ 11 июня 2011

У меня есть БД, структурированная так:

CATEGORIES > SUBCATEGORIES > PRODUCTS

Просто хочу показать категории, с которыми связано несколько продуктов, но я не знаю, является ли мой метод лучшим.Я подумал о том, чтобы поместить какое-то утверждение SELECT в первое ГДЕ, но это звучит «непрактично».Я искал в Google / MySQl docs, и мне ничего не помогло.

Пример того, что я сделал с КАТЕГОРИЯМИ> ПОДКАТЕГОРИИ:

SELECT c.*
FROM categories c
WHERE 
(
   SELECT count(*)
   FROM subcategories sc
   WHERE sc.id_categories = c.id
) > 2

С помощью этого запроса я могу видеть, какие категории имеют больше2 подкатегории, связанные с ними, я просто мог сделать то же самое, добавив таблицу PRODUCTS к этому запросу.Но я почти уверен, что это замедлит запрос.Есть ли более быстрый способ сделать этот тип запроса?Спасибо!

Ответы [ 2 ]

2 голосов
/ 11 июня 2011

Как-то так, я не знаю ваших отношений с ФК, так что я просто догадываюсь здесь.

SELECT *
FROM Categories
WHERE EXISTS(
  SELECT NULL
  FROM products
  JOIN SubCategories ON products.fkSubCatID = SubCategories.PkSubCatID
  WHERE SubCategories.fkCatID = Categories.pkCatID
  HAVING Count(*) > 2)
2 голосов
/ 11 июня 2011

Sub selects предназначены для этой цели.

SELECT * FROM categories 
WHERE 
   (  SELECT COUNT(id) 
      FROM subcategories 
      WHERE 
        category=categories.id AND 
        (  SELECT COUNT(id) 
           FROM products 
           WHERE 
             subcategory=subcategories.id
        )
    )

Обратите внимание, что этот запрос может быть неоптимальным. И может не работать, так как не проверено.

EDIT:
Следующее, вероятно, будет работать быстрее:

SELECT * FROM categories 
WHERE 
   EXISTS(
      SELECT COUNT(id) 
      FROM subcategories 
      WHERE 
        category=categories.id AND 
        EXISTS(
           SELECT *
           FROM products 
           WHERE 
             subcategory=subcategories.id
        )
    )
...