SQL-запрос для выбора продуктов из всех категорий одного родителя - PullRequest
1 голос
/ 27 марта 2012

У меня есть таблица продуктов с этой структурой

 id, title, slug, details, category(FK category.ID)

И таблица категорий: id, name, slug, parent

Категории имеют только 1 уровень. Если нет родителя, то parentполе равно 0, иначе идентификатор родительской категории сохранен

Предположим, у меня есть структура категорий, подобная этой:

FRUITS
|---- APPLE
|---- MANGO
|---- BANANA

Я использую слаг категории для запроса продуктов из категории

категории.php? cat = apple category.php? cat = mango

1-й запрос:

select id,name from category WHERE slug='$catslug'

После получения идентификатора категории используйте запрос для получения результатов этого идентификатора из таблицы продуктов

select * from products where category=$categoryid

Какой запрос требуется, если я хочу получить все продукты, размещенные в фруктах?

category.php?cat=fruits

Я хочу, чтобы все продукты были размещены в яблоках, манго, бананах (все дети фруктов)

В таблице продуктов сохраняются только дочерние идентификаторы. Как связать с ними родительскую категорию apple?

Ответы [ 3 ]

3 голосов
/ 27 марта 2012

Вы можете искать категории, связанные с продуктами, где родительская категория является категорией фруктов, используя несколько объединений. Здесь cc относится к дочерней категории, а cp относится к родительской категории. Мы получаем все продукты, имеющие дочернюю категорию, равную категории продуктов, и родительскую категорию для этой дочерней категории, равную FRUITS:

    select *
      from products p
inner join categories cc on cc.category = p.category
inner join categories cp on cp.category = cc.parentcategory
     where cp.category = 'FRUITS'

Если это должно быть универсальное решение, которое, очевидно, обрабатывает родительские и дочерние категории, вы можете проверить соответствие на любом уровне (при условии, что все имена категорий уникальны, и у каждого продукта есть категория):

    select *
      from products p
inner join categories cc on cc.category = p.category
 left join categories cp on cp.category = cc.parentcategory
     where cc.category = '$category' or cp.category = '$category'
2 голосов
/ 27 марта 2012

1) Вам не нужно использовать два запроса, вы можете использовать join:

SELECT p.id, p.title, p.slug ...
FROM products p
JOIN categories c ON c.id = p.category
WHERE c.slug = 'apple'

2) Вы можете выбрать все фруктовые продукты с этим запросом:

SELECT id, title, slug ...
FROM products
WHERE category IN (
  SELECT id
  FROM categories
  WHERE slug = 'fruits'
  UNION
  SELECT c.id
  FROM categories c
  JOIN categories c2 ON c2.id = c.parent
  WHERE c2.slug = 'fruits'
)
0 голосов
/ 28 марта 2012

Я использовал 2-й запрос, предложенный tarmaq

SELECT * 
    FROM products
    WHERE category IN (
    SELECT id
    FROM category
    WHERE slug = '$cats'
    UNION
    SELECT c.id
    FROM category c
    JOIN category c2 ON c2.id = c.parent
    WHERE c2.slug = '$cats')";

Он показывает результаты только из таблицы продуктов Не получается Название категории, Детали категории из таблицы категорий

Я пробовал это:

SELECT * 
    FROM products
    WHERE category IN (
    SELECT *
    FROM category
    WHERE slug = '$cats'
    UNION
    SELECT *
    FROM category c
    JOIN category c2 ON c2.id = c.parent
    WHERE c2.slug = '$cats')";

результат: ошибка в запросе.

также я хочу присоединиться к таблице пользователей в вышеприведенном запросе и показать имя автора (users.name) вместе с продуктом (идентификатор автора сохранен в таблице продуктов, который является FK из таблицы пользователей users.id уникален)

JOIN users on products.author = users.id

Где поместить этот оператор Join в приведенном выше запросе

EDIT - я присоединился к таблице с именем автора по этому запросу

SELECT * 
FROM products
JOIN users U ON U.id = products.author
WHERE category IN (
SELECT id
FROM category
WHERE slug = '$cats'
UNION
SELECT C.id
FROM category C
JOIN category C2 ON C2.id = C.parent
WHERE C2.slug = '$cats') 
ORDER BY products.date DESC

и теперь хочуполучить данные из таблицы категорий catagory.name, category.details с этим запросом

...