【问题标题】:MySQL complicated relational SELECTMySQL复杂的关系SELECT
【发布时间】:2012-11-29 21:02:25
【问题描述】:

我有一个 categories 表,其中包含 idparentname 字段。 parent 字段允许一个类别成为另一个类别的子类别。

示例 categories 表,其中有两个主要类别(WIDGETS 和 THINGAMABOBS),并且 WIDGETS 有 3 个子类别:

  • id 1, parent null, name "WIDGETS"
  • id 2, 1名称“小工具”
  • id 3, 1名称“DOOHICKEYS”
  • id 4, 1名称“GIZMOS”
  • id 5, parent null, name "THINGAMABOBS

我有一个带有 category 字段的 products

示例产品记录,其中产品链接到“GIZMOS”类别:

  • id 1, category 4, 名称 装置5000

我希望能够在 SELECT 语句中提供类别名称并返回该类别中的所有 产品。但是我不仅想在“GIZMOS”上找到上面的记录,而且我还希望能够通过名称“WIDGET”找到它,因为MEDIUM WIDGET是WIDGET的子项。这应该适用于无限数量的级别(即:子子子类别)

为了使这更加复杂,我希望能够将一种产品分配给多个类别。也许他们会用逗号分隔?即:如果我希望 Contraption 5000 存在于 Doohickeys 和 Thingamabobs 类别中,我会将 3,5 放在 category 字段中。

我的要求是否可以通过单个 select 语句实现?

【问题讨论】:

  • 不要通过形成逗号分隔的字符串将产品分配给多个类别。制作正确的查找表:ProductCategory ProductCategoryID ProductID CategoryID。它会为你省去很多痛苦。

标签: mysql sql


【解决方案1】:

我将从你问题的结尾开始:

为了使这更加复杂,我希望能够将一种产品分配给多个类别。也许他们会用逗号分隔?即:如果我希望 Contraption 5000 存在于 Doohickeys 和 Thingamabobs 类别中,我会将 3,5 放在类别字段中。

通过这样做,您将创建多对多关系,在这种情况下,您需要第三个名为 products_categories 的表,其中包含两列:product_idcategory_id;您将从您的产品表中删除 category 列。

如果您希望 id=1 的产品属于类别 3 和 5,您需要在 products_categories 中创建两行:

product_id | category_id
------------------------
1          | 3
1          | 5

现在到你问题的第一部分......

您需要做的是创建一个递归查询,我知道可以在 SQL Server 中完成,但老实说,我不确定是否可以在 MySQL 中完成。如果可以,我相信其他人会为您提供合适的答案。

【讨论】:

  • 将此答案与@dwurf 的答案(解决MySQL 中的分层数据管理问题)结合起来,我们将得到这个问题的完整答案。 :)
【解决方案2】:

在您的应用程序代码中执行此操作!它将更加简单和易于维护。

另见this similar post(实际上是there are many posts on this topic

【讨论】:

  • 不仅 PostgreSQL,几乎所有的 DBMS 都能够进行递归查询(Oracle、SQL Server、Firebird、H2、HSQLDB、Cubrid、Teradata、Sybase,...)
猜你喜欢
  • 2021-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多