1

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

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

还有一个类别表:id、name、slug、parent

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

假设我有这样的类别结构:

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

我使用 Category slug 从某个类别中查询产品

category.php?cat=苹果 category.php?cat=mango

第一个查询:

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

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

select * from products where category=$categoryid

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

category.php?cat=fruits

我想在苹果、芒果、香蕉(所有水果的孩子)中发布所有产品

只有子 ID 保存在产品表中,如何将父类别 apple 与这些链接?

4

3 回答 3

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'
于 2012-03-27T17:18:02.823 回答
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'
)
于 2012-03-27T17:19:36.267 回答
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 中获取数据

于 2012-03-28T03:23:28.830 回答