Php 如何在sql中选择具有多级类别的产品?

Php 如何在sql中选择具有多级类别的产品?,php,mysql,codeigniter,Php,Mysql,Codeigniter,我正在使用codeigniter和MySQL构建一个电子商务web应用程序。 这需要三个级别的类别。因此,我创建了3个表。这些是- 类别 类别id、类别名称 子类别 子类别标识、子类别名称、子类别标识 子类别 子类别\ id、子类别\名称、子类别\子类别\ id 在这里,它们作为彼此的父级链接。最后是产品表 产品 产品标识、产品名称、产品子类别标识 现在,我需要一个sql查询来获取任何特定类别的所有产品 类似于 $this->Mdl_data->select_products_by_

我正在使用codeigniter和MySQL构建一个电子商务web应用程序。 这需要三个级别的类别。因此,我创建了3个表。这些是-

类别
类别id、类别名称

子类别
子类别标识、子类别名称、子类别标识

子类别
子类别\ id、子类别\名称、子类别\子类别\ id

在这里,它们作为彼此的父级链接。最后是产品表

产品 产品标识、产品名称、产品子类别标识

现在,我需要一个sql查询来获取任何特定类别的所有产品

类似于

$this->Mdl_data->select_products_by_category($category_id);

请帮我做这个。我尝试过用PHP编程来解决这个问题。但是嵌套循环太慢了。

如果需要选择与特定类别匹配的所有产品,请尝试以下请求:

SELECT p.product_id, p.product_name, p.subsubcategory_id FROM category c 
JOIN subcategory sc ON sc.subcategory_category_id = c.category_id
JOIN subsubcategory ssc ON ssc.subsubcategory_subcategory_id = sc.subcategory_id
JOIN product p ON p.subsubcategory_id = ssc.subsubcategory_id
WHERE c.category_id = 1;
但您应该考虑更改数据库结构,使请求更快、更简单

编辑:回答关于如何改善数据库的评论

根据实际数据关系,当前数据库的设计看起来是正确的。1-many用于cat subcat,1-many用于subcat subcat。但这会导致在使用过程中产生复杂(可能很慢)的查询

我看到的一种方法是通过附加限制实现多个关系。您可以创建额外的表cat SUBACT,就像您需要许多表时所做的那样。但在该表中,您可以对子类别id设置唯一限制,因此每个子类别只能属于一个类别,实际上它变成了一对多关系。但在这种情况下,您可以向上和向下移动层次结构。这种方法只会将查询中的连接数减少1,但整个查询逻辑更容易理解

另一种方式。据我所知,这是对web商店过滤器的查询。因此,与按类别查看相比,插入新产品的情况要少得多。您可以只向产品中添加subcat_id和cat_id字段,从数据结构的角度来看,这不是一个好主意,但对于这种特殊情况,这可能是一个很好的解决方案。每次将新产品插入数据库时,您都应该通过PHP或您在服务器上使用的任何工具来控制这两个字段的正确性。但当按类别搜索产品时,您将有一个根本没有连接的简单请求


这两种方法都基于牺牲一些空间来加速和简化经常使用的查询的想法。也许还有更好的解决方案,但我现在找不到。

你应该研究将查询变成一个存储过程,你可以在MySQL中构建它,然后通过php返回结果。这叫做“糟糕的数据库设计”@RyanWilson,从现在起我将这样做。谢谢你。@u_mulder我没有找到更好的方法来组织他们。所以我不得不这么做。我当然会追求好的东西。谢谢你,这正是我想要的。万分感谢。如果您能告诉我学习专业风格sql编程的任何来源,我将非常高兴。顺便说一句,你已经保住了我的工作。我不确定我能不能给你一些建议。我在视频课上学习了SQL(俄语),没什么特别的。阅读手册,搜索stackoverflow。@AlexYokisama我对你的答案投了赞成票,因为我认为这是正确的查询,我的问题是,你如何更好地设计他的表结构?到目前为止,它看起来像是一个很好的关系设计,类别与子类别有1-many关系,子类别与子类别有1-many关系,子类别与产品有1-many关系。@RyanWilson,我已经更新了我的答案。“我不确定这是否绝对正确,但对于这个特殊的案例可能会更好。”AlexYokisama感谢您发布您的设计想法。