复杂的SQL查询子行和父行

时间:2013-08-05 12:02:11

标签: mysql sql database database-design hierarchical-data

首先,我找不到主题标题的更好名称,如果可以,请编辑标题。

我收到了以下表格:

products
- id
- name
- desc
- image

categories
- id
- name
- parent_id

products2categories
- id
- product_id
- category_id

假设我在表格中得到了这些信息:

products
- 102
- Pilot Pen Blue
- Some pen desc blah blah blah
- Some image location

categories
- 10           -11
- Pens         -Pilot Pens
- None         -10

products2categories
- 1
- 102
- 11 -> ofcourse if it's related to category 11, it also related to category 10

查看演示信息,我们可以看到我们得到的“Pilot Pen Blue”与类别编号11(Pilot Pens)有关,但是因为“Pilot Pens”是“Pens”的“孩子”每当用户寻找可用的 ALL 笔时,我也想展示Pilot笔。

我该如何实现?

如果你们有任何其他良好的数据库结构,请随时提出建议!

2 个答案:

答案 0 :(得分:0)

使用Oracle(我知道它不是您的系统,只是信息),您可以使用“CONNECT BY / PRIOR”进行一些“分层查询”(具有父/子关系的类别表是经典案例)。

我发现了另一个话题: Connect By Prior Equivalent for MySQL

他们谈论了一篇名为“Hierarchical queries in MySQL”博客的博客文章,该文章演示了如何在MySql中获得类似的结果。

答案 1 :(得分:0)

您需要在同一个表中选择父子类别。使用MySql的简单选择解决方案的问题是您的查询将取决于您拥有的级别/深度的数量。如果只有一个级别的亲子关系,otisonoza提出的查询是好的,但正如你问他,“如果类别的深度未知”是什么?如果你有4级深度怎么办?

有几种解决方案,但每种解决方案都会构建您的查询,具体取决于您拥有的级别数。在某些解决方案中,您需要存储每个类别的级别/深度。

我之前提出的链接提供了一个使用MySQL存储过程伪造“CONNECT BY / PRIOR”的解决方案。它允许您选择由父/子关系链接的分层行,无论深度如何。

另一种解决方案是使用递归函数在PHP中构造查询字符串。有一篇有趣的文章为您提供了构建此类分层数据的查询字符串的解决方案: http://www.sitepoint.com/hierarchical-data-database/

特别注意 get_path($ node)递归函数。

相关问题