SQL Query从所有类别的One Parent中选择产品

时间:2012-03-27 17:09:35

标签: sql parent jointable

我有一个具有这种结构的产品表

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

和类别表:     id,name,slug,parent

类别只有1个级别 如果没有父级,则父级字段为0,否则保存父类别的ID

假设我有类似的类别结构:

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

我使用Category slug查询类别

中的产品

category.php?猫=苹果 category.php?猫=芒果

第一次查询:

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

获取类别ID后,使用查询从产品表中获取该ID的结果

select * from products where category=$categoryid

如果我想获取在FRUITS中发布的所有产品,需要什么查询?

category.php?cat=fruits

我希望所有产品都贴在苹果,芒果,香蕉(水果的所有孩子)

如果只将子ID保存在产品表中,如何将父类别apple与这些相关联?

3 个答案:

答案 0 :(得分:3)

您可以使用多个联接查找链接到父类别为水果类别的产品的类别。此处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'

答案 1 :(得分:2)

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'
)

答案 2 :(得分:0)

我使用了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)和产品(作者ID保存在产品表中,这是用户表users.id中的FK是唯一的)

JOIN users on products.author = users.id

将此Join语句放在上面的查询

中的位置

编辑 - 我使用此查询加入了具有作者姓名的用户表

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中获取数据