2012-01-09 27 views
0

使用mysql(和php)我尝试隐藏选择菜单 类别的项目选择不可用。 基本上我卡住了,不能做到这一点。mysql:选择菜单 - 取消选择所有类别不存在于结果中

Asos使用此技术浏览低谷产品(http://www.asos.com/Men/Jeans/Cat/pgecategory.aspx?cid=4208)。

要清楚的问题不是如何做ajax的东西,但如何有效地使用MySQL和PHP来制作这样的系统。

我试图找出嵌套组要做到这一点:

(1)items(22)---------------------------------- 
      |       | 
      |       | 
    (2)producs(7)     (8)origin(21) 
      |       | 
(3)single(4)-(5)bundle(6)    | 
          --------------------- 
          |     | 
          (9)EU(14)  (15)ASIA(20) 
          |     | 
          ----------------  ----------------- 
          |    |   |    | 
         (10)DU(11) (12)PL(13) (16)CN(17) (18)JP(19) 

菜单:
类型:
-single
-bundle

产地:
- 欧盟
-ASIA

国家:
-DU
-PL
-CN
-jP

比方说,有一个在DB一个项目: 项目 '1' 是:
-single
- 欧盟
-DU

项目类别表:

itemID - cat_lft - cat_rgt 
    1  10  11 
    1  7   12 
    1  2   3 

在菜单中选择杜应选择:
DU-EU单

,然后再取消其余的(返回数组?),因为那里有是只有一个项目现在。

你可以得到的项目,如果比较的结果是出现在其余类别的,但是这听起来像使用大量查询的的...

任何意见,从哪里走?

+0

您如何将产品与嵌套集中的特定类别关联?我假设每个类别都有左/右描述符,但是每个类别都有一个ID,然后产品与类别表是多对多的? – landons 2012-01-09 03:32:09

+0

我已经向操作添加了一个示例。 – Rob 2012-01-09 03:43:46

+0

我不认为你的嵌套set lft/rgt值是正确的。欧盟不应该是7/8,因为这将表明它是一片叶子,而不是一个分支... – landons 2012-01-09 03:58:00

回答

1

下面是我该怎么做。确保您的产品仅以叶子分类(即left = right + 1)。因此,产品可以分类为“DU”,但不是“原产地”或“亚洲”。“

分类表:

  • CATEGORY_ID
  • 离开

Products表:

  • PRODUCT_ID
  • ...

Categories_Products表:

  • CATEGORY_ID
  • PRODUCT_ID

SQL查询,以确定检查与选中类别:

SELECT 
    `categories`.`category_id`, 
    `categories`.`name`, 
    IFNULL(COUNT(`categories_products`.`id`), 0) AS `count` FROM `categories` 

LEFT JOIN `categories` as `children` ON 
    `children`.`left` > `categories`.`left` AND 
    `children`.`right` < `categories`.`right` 

JOIN `categories_products` ON 
    `categories_products`.`category_id` = `children`.`category_id` 

GROUP BY `categories`.`category_id` 

如果 “数” 为0时,不要选择它;否则,它会被检查,并且您知道该类别中有多少物品。这是未经测试的,所以它可能需要一些调整。您明确希望category_id,product_id,left和right列上的索引。

加法:SQL查询来选择产品在一个或多个类别(参见下面的化合物的条件):

SELECT `products`.* FROM `categories` 

JOIN `categories` as `children` ON 
    `children`.`left` >= `categories`.`left` AND 
    `children`.`right` <= `categories`.`right` 

JOIN `categories_products` ON 
    `categories_products`.`category_id` = `children`.`category_id` 

JOIN `products` ON 
    `products`.`product_id` = `categories_products`.`product_id` 

WHERE `categories`.`category_id` IN (1,2,3,n,...) 

GROUP BY `products`.`product_id` 

加法:逻辑选择产品在多个类别,化合物过滤(产品必须在所有类别中匹配):

您必须为所需的每个类别要求分别进行连接。请注意,这种类型的查询可能会非常缓慢,所以在进行一些基准测试时也是如此。用多个查询(每个类别一个查询)可能会更好,并将结果结合到应用程序代码中。

沿着这些相同的路线,我建议像“single vs. bundle”这样的东西在你的产品表中是一个ENUM,而分类留给更抽象的结构(地区作品,以及传统的面向消费者,“逻辑”分类结构),这不是一个简单的/或标志。

+0

不错,我要试一试 – Rob 2012-01-09 04:01:39

+0

的确显示(作品!)哪些类别与产品相关联(so你知道这个类别中有多少物品)。感谢您的帮助。有关如何显示类别中的哪些项目(或不是)的任何提示?以及如何根据选定的类别进行查询。 – Rob 2012-01-09 05:35:32

+0

我已经更新了我的答案,并根据类别选择了一些产品 – landons 2012-01-09 21:13:43

相关问题