我喜欢的是什么 a:显示所选类别的全部的所有项目 b:根据选择
返回/更新类别可用的类别列表我喜欢使用邻接列表模型或嵌套集来存储和找到的项目 我已经对这两种方法进行了实验,并且可以使用对这种情况最好的建议。
目前我正在使用(测试)邻接列表模型,如下所示:
items:
ID | item_name
====================
1 | car
2 | boat
3 | bike
items_cats: (many to many)
iid | cid
====================
1 | 1
1 | 2
1 | 4
1 | 7
2 | 1
2 | 3
2 | 4
2 | 7
3 | 1
3 | 3
3 | 4
3 | 8
categorys:
ID | cat_name | parent_id
========================
1 | safety: | 0 (0 = no parent)
2 | safe | 1
3 | dangerous | 1
4 | fun: | 0
5 | a bit | 5
6 | boring | 5
7 | funny | 5
8 | cool | 5
所以基于cid获取项目没问题,但你会怎样:
第一:选择:
1-显示所有有猫id的项目:cid 7(搞笑)?
2-返回(数组/对象)所有类别的项目还包含cid 7?
你们都会在一个查询中做到这一点,还是两个会更有效率?
第二名:选择:
3-显示所有具有cat id的项目:cid 7和还包含cat id'3'(危险)
4-返回(数组/对象)所有类别包含cid 7和cid 3的项目?
为了选择多个类别,我找到了流动的解决方案。这是一个好的,并且会获得任何表现,特别是当类别的数量增长时?
SELECT
DISTINCT t1.product_id, t1.category_id
FROM
items_cats t1
INNER JOIN
items_cats t1b
ON t1.iid =t1b.iid
WHERE
t1.cid=3 AND
t1b.cid=7
答案 0 :(得分:0)
要获取类别ID = 7的所有项目的列表,请从您的many:many table
开始select
i.item_name
from
items_cat ic
join items i
on ic.iid = i.id
where
ic.cid = 7
要获取与类别ID为7的任何项目相关联的所有类别,您可以从第一个项目扩展并获取这些项目ID的关联类别
select DISTINCT
ic2.cid,
c.cat_name,
coalesce( CatParent.cat_name, "" ) as ParentCategoryName
from
( select distinct ic.iid
from items_cat ic
where ic.cid = 7 ) QualifiedItems
JOIN items_cat ic2
on QualifiedItems.iid = ic2.iid
JOIN categorys c
on ic2.cid = c.id
LEFT JOIN categorys CatParent
on c.parent_id = CatParent.ID
对于3和4,它会是相似的,但要同时限定(或任何时候,多于一个),你需要应用OR,GROUP BY并确保最终计数与你试图获得资格的那些相匹配
select
i.item_name
from
items_cat ic
join items i
on ic.iid = i.id
where
ic.cid in( 3, 7 )
group by
i.item_name
having
count(*) = 2
所以你可以更好地理解和应用这些原则,我会留下最后一个让你尝试实施......如果你真的卡住了,请告诉我...... :)