当前位置: 首页 > 知识库问答 >
问题:

如何使用邻接列表模型从MySQL分层类别树中获取数据?

任昊苍
2023-03-14

作为练习,我正在用InnoDB引擎为一个购物应用程序html" target="_blank">构建一个MySQL关系数据库(我是一个新手,对于初学者的问题,我提前表示歉意)。

对于产品类别,我决定使用邻接列表模型作为分层数据树。有两个关注表:

  • 类别
  1. category_id PK
  2. 名称
  3. parent_ id
  • 产品
  1. id主键
  2. 名称
  3. 描述
  4. 价格
  5. 类别_ id FK

我找到了一个来自Mike Hillyer的查询,用于检索完整的树:

SELECT t1.name AS lev1, t2.name as lev2, t3.name as lev3, t4.name as lev4
FROM categories AS t1
LEFT JOIN categories AS t2 ON t2.parent = t1.category_id
LEFT JOIN categories AS t3 ON t3.parent = t2.category_id
LEFT JOIN categories AS t4 ON t4.parent = t3.category_id
WHERE t1.name = 'ELECTRONICS';

但我不知道如何将其与产品表联系起来。

我使用引用这个问题的查询来获取特定类别(第19个元素)的孩子:

SELECT  category_id,
        name,
        parent_id 
FROM    (select * from categories
         order by parent_id, category_id) products_sorted,
        (select @pv := '19') initialisation
WHERE   find_in_set(parent_id, @pv)
AND     length(@pv := concat(@pv, ',', category_id))

我认为我应该使用JOIN从两个表中进行选择,但我没有得到正确的结果。

我想做的是,通过category_id获取产品,还要检索父类别。

此外,当用户单击根或任何级别的子类别时,我也想从子节点获取所有产品。

共有1个答案

呼延光明
2023-03-14

从给定类别(包括子类别)中获取所有产品的解决方案是

SELECT *
FROM    products
WHERE   category_id IN
(
    SELECT category_id
    FROM `categories`
    WHERE FIND_IN_SET(`category_id`, (
    SELECT GROUP_CONCAT(Level SEPARATOR ',') FROM (
      SELECT @Ids := (
          SELECT GROUP_CONCAT(`category_id` SEPARATOR ',')
          FROM `categories`
          WHERE FIND_IN_SET(`parent_id`, @Ids)
      ) Level
      FROM `categories`
      JOIN (SELECT @Ids := 1) temp1
   ) temp2
))
)

上面的查询从 ID 为 1 的类别(和子类别)中选择所有产品

这是小提琴链接

 类似资料:
  • 本文向大家介绍如何获取MySQL表列的数据类型?,包括了如何获取MySQL表列的数据类型?的使用技巧和注意事项,需要的朋友参考一下 您可以在“ information_schema.columns”的帮助下获取MySQL表列数据类型。 语法如下- 要了解上述语法,让我们首先创建一个表- 应用以上语法获取MySQL列数据类型。查询如下- 以下是输出- 如果需要,请在数据类型之前的输出中也包括列名称。

  • 问题内容: 我使用PDO和MySQL,出于某种原因,当从数据库中获取int类型的值时,PDOStatement返回的是数字的字符串表示形式,而不是数字类型的值。如何防止这种情况发生? 我注意到有一个PDO类的属性:应该可以解决这个问题,但是在尝试修改它时,它抛出一个错误,指出该属性对MySQL驱动程序无效。 查询数据库时,获取字符串而不是数字是否正常? 问题答案: 我不认为可以在PHP 5.2中完

  • 我在JPA上工作。我的要求是从表中获取列名和数据类型。我有查询来做这件事,但这些是原生查询的。如果我使用这些原生查询,它将支持任何数据库,如Oracle,MySql,....... 现在我正在使用MySql和JPA工作得很好。 下面的查询用于获取表列名 我使用JPA中的createNativeQuery()执行了上面的查询。它将支持所有的数据库。如果没有,我怎么能做到这一点。非常感谢。

  • 我有一张桌子在下面。我想获取父级所在的所有类别。 当我通过id=4时,它应该给出以下结果 但它给出了总体表的一般结果。我只需要那些id=4的记录。查询只给出2条记录测试4

  • 问题内容: 我有一个电影数据库,我想要列出当年没有电影的年份。所以我只需要一个列表(1900 .. 2012),然后我就可以加入和加入而不是加入。 我有: 但这似乎是非SQL的,并且与运行Python代码来创建同一张表相比,仅略微减少了麻烦。我真的很喜欢那些不使用存储过程,不使用循环并且不使用实际表的东西,以这种关注的顺序。 问题答案: 几年前我也遇到过类似的问题。我的解决方案是: 1.顺序表 我

  • 我的起点是一个包含类别ID及其父ID的数组,来自Virtuemart categories表,如下所示: 我需要有一个字符串,每个最后类别的孩子完整的路径由/(斜杠)之间的孩子和由,(逗号)之间的第一级父母 我的输出应该是: 我可以把启动数组转换成这个