具有多个条件的项目的mysql查询(项目选项)

时间:2012-01-11 00:47:39

标签: mysql database

我喜欢的是什么 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

1 个答案:

答案 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

所以你可以更好地理解和应用这些原则,我会留下最后一个让你尝试实施......如果你真的卡住了,请告诉我...... :)