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

时间:2018-03-07 18:11:46

标签: php mysql codeigniter

我正在使用codeigniter和MySQL来构建电子商务Web应用程序。 这个需要三个级别的类别。所以我创建了3个表。这些是 -

类别
category_id,category_name

子类
subcategory_id,subcategory_name,subcategory_category_id

subsubcategory
subsubcategory_id,subsubcategory_name,subsubcategory_subcategory_id

这里他们被链接为彼此的父母。最后我有产品表

产品 product_id,product_name,product_subsubcategory_id

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

类似于
的东西

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

请帮我解决这个问题。我已经尝试过PHP编程来解决这个问题。但是很多嵌套循环都太慢了。

1 个答案:

答案 0 :(得分:1)

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

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;

但您应该考虑更改数据库结构,以使您的请求更快更简单。

修改:回答有关如何改进数据库的评论。

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

我看到的一种方法是通过额外的限制来实现许多关系。你可以创建额外的表cat-subcat,就像你需要很多人一样。但是在该表中,您可以将唯一限制设置为subcat_id,因此每个subcat只能属于1只猫,它实际上是1-many关系。但在这种情况下,您可以向上和向下移动层次结构。这种方法只会将查询中 JOINs 的数量减少1,但查询的整个逻辑将更容易理解。

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

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