gpt4 book ai didi

php - 电子商务、分类中的产品和分类浏览

转载 作者:行者123 更新时间:2023-12-04 14:43:23 31 4
gpt4 key购买 nike

我正在为客户建立一个 EC 网站,项目经理提出了一些奇怪的想法,我正在努力实际实现他向客户销售的产品。

这是我的主要问题和系统设置的快速总结:产品在类别内,类别可能是另一个类别的子类别。因此,该类别在网站的左侧边栏中显示为树。

用户可以浏览任何类别,甚至是非“叶”类别,如果用户单击非叶类别,则应在 1 级类别上显示类似的列表(同样适用于 2 级类别):

big category 1
category level ( 3 or 2 )
product 1
product 2
product 3
category level ( 3 or 2 )

这些东西还应该有一些分页,并出现在每页上的 5 个产品上。另外,类别应该以它们出现在左侧菜单中的相同方式排序......我的数据库方案是这样的:

+-------------+    +-------------+
+ category + + product +
+-------------+ +-------------+
+ category_id + + product_id +
+ parent_id + + category_id +
+-------------+ +-------------+

我真的不知道我应该如何编写 SQL 以确保产品按应有的顺序显示(比如订购产品和类别有菜单)。

我还关心整个设置的性能,如果用户选择非“叶子”类别,我将不得不搜索所有子类别并在 (id1, id2, id3) 中创建一个大类别,我知道根据经验,长 IN 语句表现不佳。

如果有人遇到相同的设计/问题,并有一些如何制作的建议,我将不胜感激。

最佳答案

您可以使用 Materialized Path 设计。目录路径是物化路径的示例。也就是说,一系列祖先值,连接在一起,用一些字符(“/”或“,”是常见的)分隔它们。

所以你可能有类别:

+---------------------------------------------+
| cat_id | Name | cat_path | depth |
+---------------------------------------------+
| 1 | Electronics | 1/ | 1 |
| 2 | Digital cameras | 1/2/ | 2 |
| 3 | SLR cameras | 1/2/3/ | 3 |
| 4 | Audio | 1/4/ | 2 |
| 5 | Speakers | 1/4/5/ | 3 |
| 6 | Wall Satellites | 1/4/5/6/ | 4 |
| 7 | Computers | 1/7/ | 2 |
+---------------------------------------------+

现在,如果您想要音频下的所有产品,您可以执行如下查询:

SELECT p.*, pc.*
FROM Products p JOIN Categories pc ON (p.cat_id = pc.cat_id)
JOIN Categories c ON (pc.cat_path LIKE c.cat_path||'%')
WHERE c.name = 'Audio';

例如,'1/4/5/6' LIKE '1/4/%' 为真,因此包含 Wall Satellites。对于任何其他音频子类别也是如此。


关于菜单渲染的问题:我假设您希望菜单渲染: - 所选类别的所有祖先 - 所选类别的祖先的所有 sibling

因此,如果您选择“演讲者”,您会看到:

  • 电子产品
    • 音频
      • 演讲者
    • 电脑
    • 数码相机

但您不想要计算机或数码相机的后代(即扬声器的“表亲”)。

SELECT uncle.name, uncle.depth
FROM Categories chosen
JOIN Categories ancestor ON (chosen.cat_path LIKE ancestor.cat_path||'%')
JOIN Categories uncle ON (ancestor.depth = uncle.depth
AND SUBSTRING(REVERSE(ancestor.cat_path), 3, 100) = SUBSTRING(REVERSE(uncle.cat_path), 3, 100))
WHERE chosen.name = 'Speakers'
ORDER BY uncle.depth, uncle.name;

我正在使用一个技巧来检测叔叔:在剥离最后一个元素之后比较路径。为此,反转字符串,然后剥离 first 元素。这至少应该在 MySQL 和 MS SQL Server 中工作,但 REVERSE() 不是标准的,可能无法移植到其他品牌的 RDBMS。

请注意,cat_path 中的每个元素可能应该允许多于一位,在这种情况下,子字符串偏移量也应该增加。

关于php - 电子商务、分类中的产品和分类浏览,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1641397/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com