【问题标题】:Search products with parent and child categories搜索具有父子类别的产品
【发布时间】:2010-06-25 14:30:44
【问题描述】:

我正在构建一个购物车网站并使用 SQL 表

类别

Id int,
Parent_Id,
Description varchar(100)

数据:

1   0   Electronics
2   0   Furniture
3   1   TVs
4   3   LCD
5   4   40 inches
6   4   42 inches

产品

Id int,
Category_Id int
Description...

数据:

1   5   New Samsung 40in LCD TV
2   6   Sony 42in LCD TV

如您所见,最后一个子类别只有一列

现在我需要做的是在主页上按主类别搜索,例如,如果用户点击电子产品,则显示两台电视,因为它们在电子产品上都有父-父-父 ID,请记住 Products 表确实有类别只有一列。

我是否应该更新产品表并为子类别添加 6 列来解决这个问题?或者我怎样才能为此构建一个有效的 SQL 存储过程?

谢谢

杰瑞

【问题讨论】:

  • 什么数据库类型和版本?

标签: sql stored-procedures parent-child


【解决方案1】:

在 Oracle 中,您将使用 CONNECT BY

【讨论】:

  • 谢谢你的回答,可惜我没有Oracle
【解决方案2】:

如果您使用的是 SQL 2008,那么您可能需要查看 HIERARCHYID 数据类型。否则,您可能需要考虑重新设计 Category 表。您现在如何对其建模,您必须使用递归从子节点到父节点或从父节点到子节点。

您可以将嵌套集模型用于层次结构,而不是使用链表模型(这就是您所拥有的)。在 Joe Celko 和 Nested Set Model 上进行搜索,您应该能够找到一些很好的描述。他还写了an entire book on modeling trees and hierarchies in SQL。嵌套集模型需要一些设置来维护数据,但在选择数据时使用起来要容易得多。由于您的类别可能会保持相对稳定,这似乎是一个不错的解决方案。

编辑:要实际回答您的问题...您可以编写一个位于 WHILE 循环中的存储过程,选择子级并收集在表变量中找到的任何产品。在每个循环中检查@@ROWCOUNT,如果它为 0,那么你已经走到了尽头。然后你只需从你的表变量中选择出来。这是一种递归(而且速度很慢)的方法,这就是为什么这种类型的模型在 SQL 中的许多情况下都不能很好地工作的原因。

在任何情况下,您都不应只向您的产品表中添加 6 个(或 7 或 8 个)类别 ID。坏的。坏的。坏的。这将是一场维护噩梦(当您的类别深入 7 级时会发生什么……然后是 8 级……然后是 9 级。

【讨论】:

    【解决方案3】:

    使用递归 CTE 来做到这一点!像梦一样工作! http://msdn.microsoft.com/en-us/library/ms186243.aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多