使用mySQL从选定类别和所有子类别获取产品

使用mySQL从选定类别和所有子类别获取产品,mysql,Mysql,第一次我在这里找不到答案,所以这里什么都没有 我有以下表格: 数据产品 产品ID 产品名称 dataProductCategories 产品ID 类别 数据类别 类别 类别名称 父ID 每个产品可以属于多个类别,因此我使用dataProductCategories将产品连接到每个选定类别 在dataCategories中,我存储类别,如果类别是子类别,我将父类别的categoryID放在parentID列中 我想得到的是所选类别中的所有类别+所有(如果有)子类别 因此,如果有一个名为“衣服”的类

第一次我在这里找不到答案,所以这里什么都没有

我有以下表格:

数据产品

产品ID 产品名称 dataProductCategories

产品ID 类别 数据类别

类别 类别名称 父ID 每个产品可以属于多个类别,因此我使用dataProductCategories将产品连接到每个选定类别

在dataCategories中,我存储类别,如果类别是子类别,我将父类别的categoryID放在parentID列中

我想得到的是所选类别中的所有类别+所有(如果有)子类别

因此,如果有一个名为“衣服”的类别和另一个名为“裤子”的类别,其categoryID为衣服的父ID。该类裤子将是儿童服装。假设我还有一个类别叫做毛衣,也在衣服下面

因此,如果我选择衣服类别,我想要衣服、裤子和毛衣下面列出的所有产品。多年来一直试图解决这个问题,现在感觉像是:/

我使用下面的SQL成功地获得了我想要的数据,但是速度很慢

SELECT datacategories.categoryid, 
       datacategories.categoryname, 
       dataproducts.productname, 
       dataproducts.productid 
FROM   datacategories 
       JOIN dataproductcategories 
         ON datacategories.categoryid = dataproductcategories.categoryid 
       JOIN dataproducts 
         ON dataproducts.productid = dataproductcategories.productid 
WHERE  dataproducts.instock <> 0 
       AND dataproducts.instock > dataproducts.lockedstock 
       AND dataproducts.isconfig = 0 
       AND dataproducts.status = 1 
       AND dataproducts.dummy = 0 
       AND dataproducts.markeddeleted = 0 
       AND dataproducts.accountid = '88' 
       AND dataproductcategories.categoryid IN (SELECT categoryid 
                                                FROM   datacategories 
                                                WHERE  categoryid = '22828' 
                                                UNION 
                                                SELECT d.categoryid 
                                                FROM   datacategories c 
                                                       INNER JOIN datacategories 
                                                                  d 
                                                               ON c.categoryid = 
                                                                  d.parentid 
                                                WHERE  c.categoryid = '22828' 
                                                        OR c.parentid = '22828') 
GROUP  BY dataproducts.productid 
ORDER  BY dataproducts.productid DESC 
LIMIT  101 offset 0 

不是说每个类别都可以属于多个类别,所以我使用dataProductCategories,你的意思是说每个产品都可以属于多个类别,所以我使用dataProductCategories?如果有一天你会有一个孩子的孩子,那么你的解决方案将永远不会起作用。相反,我建议使用如图中所示的左-右方法,因为这样可以加快查询速度,将此行union select d.categoryID更改为union select c。categoryID@ChristianBaumann没错!我已经编辑了这个问题。谢谢大家!@塞利马乔:好的,我会尽力理解你发布的图片,并尝试修改我的查询。谢谢你的反馈!