【问题标题】:How to select all the subcategories and their child using parent id?如何使用父 ID 选择所有子类别及其子类别?
【发布时间】:2017-11-22 19:16:13
【问题描述】:

我正在创建一个类别和子类别系统。假设我有一个主要类别,例如'Food'。它有一个孩子,例如'Drinks',饮料有另一个孩子'Juice',果汁有一个孩子'Organic',有机有一个孩子'Grape Juice'。所以基本上Food 是主要父级,结构是Food>Drinks>Juice>Organic>Grape Juice。现在我将它们存储在如下类别表中:

如您所见,我有一个直接父 ID,例如 pid。现在如何从该表中选择主类别Food 下的所有类别名称?我将获得cat_id 1。那么,我如何使用这个cat_id 来跟踪表格中的所有子类别及其子类别、子子类别等? SQL将是什么?任何人都可以帮忙吗?提前致谢。

【问题讨论】:

  • 在提问前了解如何提问。 stackoverflow.com/help/how-to-ask
  • pid的数据类型是什么?
  • pid 数据类型是 int @Harshil
  • 那为什么food没有pid的值呢?下一个主要类别的pid 的值是多少?
  • 对不起,它在 varchar 中。食物是主要的父母,这就是为什么它没有任何父母id(pid)。

标签: mysql


【解决方案1】:

这将选择与 where 子句中给出的 ca_tid 相关的所有列。我相信这就是你所要求的。如果不是,请详细说明。

SELECT 
cat_level_1.cat_name AS cat_level_1,
cat_level_2.cat_name AS cat_level_2,
cat_level_3.cat_name AS cat_level_3,
cat_level_4.cat_name AS cat_level_4,
cat_level_5.cat_name AS cat_level_5

FROM your_table AS cat_level_1

JOIN your_table AS cat_level_2
ON cat_level_1.ca_tid = cat_level_2.pid

JOIN your_table AS cat_level_3
ON cat_level_2.ca_tid = cat_level_3.pid

JOIN your_table AS cat_level_4
ON cat_level_3.ca_tid = cat_level_4.pid

JOIN your_table AS cat_level_5
ON cat_level_4.ca_tid = cat_level_5.pid

WHERE cat_level_1.ca_tid = 1

【讨论】:

  • 你怎么知道只有5个关卡?
  • @Harshil 老实说,我没有考虑到这一点。当 op 声明结构为Food>Drinks>Juice>Organic>Grape Juice 时,我认为只会有 5 个级别。我将看到有关使用更动态的查询更新答案的信息,因为您有一个很好的观点
  • @Gamer 我不确定您是否期望数据返回?此外,结构是否总是最多包含 5 个类别?或者树可以有动态数量的类别?
【解决方案2】:

如果整个表严格遵循新类别具有' 'pid 的格式并且整个层次结构连续存储,则以下查询将适用于任意数量的子类别:

select 
* from
t
where cat_id >= 1    // Instead of 1, you can put here the passed `cat_id`
and cat_id < (select min(cat_id)
            from t
            where pid = ' ' and cat_id > 1) // Instead of 1, you can put here the passed `cat_id`
;

Click here for DEMO

【讨论】:

  • 请尝试以上答案。
  • 如果不是“连续存储”怎么办?自从您在我的回答中发表评论以来,我一直在思考这个问题。那可能吗?如果一个人不知道子类别有多深,并且数据没有连续存储......是否能够获得所需的数据集?我真的对此感到好奇,因为我们过去曾遇到过这种结构,但总是新有多少子类别。如果有一种方法可以通过直接 sql 获取它们,而不知道数据不连续存储的层次结构……那对未来很有用。
  • 如果数据没有连续存储,那么问题中给出的 IMMEDIATE pid 的整个概念将失败。因此,很可能会根据问题假设数据连续存储。
  • 当然,可以识别没有连续性存储的子类别的查询将是一个更通用和更有帮助的答案,但如果数据以这种连续性存储,则无需在此处使任务/查询变得复杂。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多