我有一个具有这种结构的产品表
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与这些相关联?
答案 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中获取数据