Mysql 复杂关系选择

Mysql 复杂关系选择,mysql,sql,Mysql,Sql,我有一个带有id、父项和名称字段的类别表。父字段允许一个类别成为另一个类别的子类别 示例类别表格,其中有两个主要类别(小部件和THINGAMABOBS),小部件有3个子类别: product_id | category_id ------------------------ 1 | 3 1 | 5 id 1,父级null,名称为“小部件” id 2,父级1,名称为“GADGETS” id 3,父项1,名称为“DOOHICKEYS” id 4,父项1,名称为

我有一个带有id、父项和名称字段的类别表。父字段允许一个类别成为另一个类别的子类别

示例类别表格,其中有两个主要类别(小部件和THINGAMABOBS),小部件有3个子类别:

product_id | category_id
------------------------
1          | 3
1          | 5
  • id 1,父级null,名称为“小部件”
  • id 2,父级1,名称为“GADGETS”
  • id 3,父项1,名称为“DOOHICKEYS”
  • id 4,父项1,名称为“Gizmo”
  • id 5,父项为空,名称为“THINGAMABOBS”
我有一个带有类别字段的产品

示例产品记录产品链接到“Gizmo”类别的位置:

  • id 1,第4类,名称精巧装置5000
我希望能够在SELECT语句中提供一个类别名称,并获取该类别中的所有产品。但我不仅希望在“Gizmo”上找到上述记录,还希望能够通过名称“WIDGET”找到它“,因为媒体小部件是小部件的子部件。这应该适用于未指定数量的级别(即:子类别)

为了使这更复杂,我希望能够将一个产品分配到多个类别。也许它们会用逗号分隔?i、 e:如果我想让精巧装置5000存在于Doohickeys和Thingamabobs类别中,我会在类别字段中输入3,5


我所问的是否可以用一个select语句实现?

在应用程序代码中执行此操作!它将更简单,更易于维护


另请参见(实际上)

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

为了使这更复杂,我希望能够将一个产品分配到多个类别。也许它们会用逗号分隔?i、 e:如果我想让精巧装置5000存在于Doohickeys和Thingamabobs类别中,我会在类别字段中输入3,5

通过这样做,您将创建一个多对多关系,在这种情况下,您将需要一个名为
products\u categories
的第三个表,该表包含两列:
product\u id
category\u id
;您需要从products表中删除
category

如果希望id=1的产品属于类别3和类别5,则应在products\u categories中创建两行:

product_id | category_id
------------------------
1          | 3
1          | 5
现在到你问题的第一部分


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

不仅仅是PostgreSQL,而且几乎所有的数据库管理系统都有能力进行递归查询(Oracle、SQL Server、Firebird、H2、HSQLDB、Cubrid、Teradata、Sybase等)。不要通过形成逗号分隔的字符串将产品分配给多个类别。制作一个合适的查找表:ProductCategory ProductCategoryID ProductID CategoryID。这将为您省去很多痛苦。将这个问题与@dwurf的答案(它解决了MySQL中的分层数据管理问题)结合起来,我们将得到这个问题的完整答案。:)