gpt4 book ai didi

mysql:选择菜单 - 取消选择结果中不存在的所有类别

转载 作者:行者123 更新时间:2023-11-29 14:37:13 25 4
gpt4 key购买 nike

使用 mysql(和 php)我尝试隐藏在选择菜单之外不可用于项目选择的类别。基本上我被困住了,找不到办法做到这一点。

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)

菜单:
类型:
-单
-捆绑

来源:
-欧盟
-亚洲

国家:
-DU
-PL
-CN
-JP

假设数据库中有一项:项目“1”位于:
-单
-欧盟
-DU

项目类别表:

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

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

并取消选择其余部分(返回数组?),因为目前只有一项。

您可以获取项目并比较结果是否存在于剩余类别中,但这听起来像是使用了大量查询...

有什么建议吗?

最佳答案

我会这样做。确保您的产品仅按叶子分类(即左 = 右 + 1)。因此,产品可以归类为“DU”,但不能归类为“原产地”或“ASIA”。

类别表:

  • category_id
  • 姓名

产品表:

  • 产品 ID
  • 姓名
  • ...

Categories_Products 表:

  • category_id
  • 产品 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`

如果“count”为0,则不选中;否则,它会被检查,并且您知道该类别中有多少项目。这尚未经过测试,因此可能需要一些调整。您肯定需要在category_id、product_id、左列和右列上建立索引。

添加:用于选择一个或多个类别中的产品的 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`

添加:在多个类别中选择产品的逻辑,复合过滤(产品必须在所有类别中才能匹配):

您必须针对您想要的每个类别要求进行单独的联接。请注意,这种类型的查询可能会变得非常慢,因此请随时进行一些基准测试。您可能最好进行多个查询(每个类别一个),并将结果合并到应用程序代码中。

沿着同样的思路,我建议在您的产品表中使用“单一与捆绑”之类的 ENUM,并将分类留给更抽象的结构(区域有效,传统的面向消费者的、 “逻辑”分类结构),这不是一个简单的非此即彼标志。

关于mysql:选择菜单 - 取消选择结果中不存在的所有类别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8783620/

25 4 0