【问题标题】:How to select product with multi level categories in sql?如何在sql中选择具有多级类别的产品?
【发布时间】:2018-03-07 18:11:46
【问题描述】:

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

类别
类别id,类别名称

子类别
subcategory_id,subcategory_name,subcategory_category_id

子子类别
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 编程来解决这个问题。但是有很多嵌套循环,速度太慢了。

【问题讨论】:

  • 你应该考虑把查询变成一个存储过程,你可以在 MySQL 中构建它,然后通过 php 返回结果。
  • 这被称为“糟糕的数据库设计”
  • @RyanWilson 从现在开始我会这样做。谢谢。
  • @u_mulder 我没有找到更好的方法来让它们井井有条。所以我不得不这样做。我当然会追求好的。也谢谢你

标签: php mysql codeigniter


【解决方案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,就像您需要多对多时所做的那样。但是在该表中,您可以将 unique 限制设置为 subcat_id,因此每个 subcat 只能属于 1 只猫,它实际上变成了 1-many 关系。但在这种情况下,您可以向上和向下移动层次结构。这种方法只会将查询中的 JOINs 数量减少 1,但查询的整个逻辑会更容易理解。

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

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

【讨论】:

  • 这正是我想要的。百万感谢。如果你能告诉我任何学习专业风格的 sql 编程的资源,我会很高兴。顺便说一句,你已经救了我的工作了。
  • 我不确定能不能给你一些建议。我从视频课程(俄语)中学习了 SQL,没什么特别的。只需阅读手册并搜索 stackoverflow。
  • @AlexYokisama 我赞成您的回答,因为这对我来说看起来像是正确的查询,我的问题是,您将如何更好地设计他的表结构?到目前为止,它看起来像是一个很好的关系设计,类别与子类别有一对多关系,子类别与子子类别有一对多关系,子子类别与产品有一对多关系。
  • @RyanWilson,我已经更新了我的答案。我不确定这是否绝对正确,但对于这种特殊情况可能会更好。
  • @AlexYokisama 感谢您发布您的设计理念。
猜你喜欢
  • 1970-01-01
  • 2021-01-17
  • 2020-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多