mysql表中的子类别和子类别(coldfusion,mysql)

mysql表中的子类别和子类别(coldfusion,mysql),mysql,coldfusion,Mysql,Coldfusion,我有一个关于ColdFusion和Mysql的问题。我有两张桌子:PRODUCT和PRODUCT_CAT。我想列出包含一些标记为:IS_EXTRANET=1的特殊产品的类别。所以我写了这个查询: <cfquery name="get_product_cat" datasource="#dsn1#"> SELECT PC.PRODUCT_CAT,PC.PRODUCT_CATID,PC.HIERARCHY FROM PRODUCT_CAT PC LEFT OUTER JO

我有一个关于ColdFusion和Mysql的问题。我有两张桌子:PRODUCT和PRODUCT_CAT。我想列出包含一些标记为:IS_EXTRANET=1的特殊产品的类别。所以我写了这个查询:

<cfquery name="get_product_cat" datasource="#dsn1#">
    SELECT PC.PRODUCT_CAT,PC.PRODUCT_CATID,PC.HIERARCHY
    FROM PRODUCT_CAT PC LEFT OUTER JOIN PRODUCT P ON P.PRODUCT_CATID=PC.PRODUCT_CATID
    WHERE P.IS_EXTRANET=1
    GROUP BY PC.PRODUCT_CATID,PC.PRODUCT_CAT,PC.HIERARCHY
    ORDER BY PC.HIERARCHY,PC.PRODUCT_CAT
</cfquery>
以及输出:

但有一个问题。在product_cat表中,有两种类别:子类别和子类别。因此,在每个子类别中,没有产品,但有子类别。当我尝试列出仅具有is_extranet=1定义的产品的类别时,没有列出任何类别。但我也希望下面列出的类别。换句话说,如果子类别内是定义为_extranet=1的产品,则显示子类别,然后显示其子类别和这些产品。我希望我说得很清楚:


另外,under category的层次结构如下所示:100,sub:100.001的层次结构是唯一的,这对我来说很有用:

SELECT PC.PRODUCT_CAT,PC.PRODUCT_CATID,PC.HIERARCHY
  FROM PRODUCT_CAT PC
  WHERE LEFT(PC.HIERARCHY,3) IN 

  (SELECT DISTINCT LEFT(PC.HIERARCHY,3)
    FROM PRODUCT_CAT PC
    INNER JOIN PRODUCT P ON P.PRODUCT_CATID=PC.PRODUCT_CATID
    WHERE P.IS_EXTRANET=1)

GROUP BY PC.PRODUCT_CATID,PC.PRODUCT_CAT,PC.HIERARCHY
ORDER BY PC.HIERARCHY,PC.PRODUCT_CAT;
或者:

SELECT PC.PRODUCT_CAT,PC.PRODUCT_CATID,PC.HIERARCHY
  FROM PRODUCT_CAT PC
  INNER JOIN 
  (SELECT LEFT(PC.HIERARCHY,3) AS UPPER
    FROM PRODUCT_CAT PC
    INNER JOIN PRODUCT P ON P.PRODUCT_CATID=PC.PRODUCT_CATID
    WHERE P.IS_EXTRANET=1) AS H
    ON LEFT(PC.HIERARCHY,3)=H.UPPER 
GROUP BY PC.PRODUCT_CATID,PC.PRODUCT_CAT,PC.HIERARCHY
ORDER BY PC.HIERARCHY,PC.PRODUCT_CAT;

我不确定哪一个性能更好。小提琴是

基于PC.HIERARCHY是唯一的,这对我来说很有用:

SELECT PC.PRODUCT_CAT,PC.PRODUCT_CATID,PC.HIERARCHY
  FROM PRODUCT_CAT PC
  WHERE LEFT(PC.HIERARCHY,3) IN 

  (SELECT DISTINCT LEFT(PC.HIERARCHY,3)
    FROM PRODUCT_CAT PC
    INNER JOIN PRODUCT P ON P.PRODUCT_CATID=PC.PRODUCT_CATID
    WHERE P.IS_EXTRANET=1)

GROUP BY PC.PRODUCT_CATID,PC.PRODUCT_CAT,PC.HIERARCHY
ORDER BY PC.HIERARCHY,PC.PRODUCT_CAT;
或者:

SELECT PC.PRODUCT_CAT,PC.PRODUCT_CATID,PC.HIERARCHY
  FROM PRODUCT_CAT PC
  INNER JOIN 
  (SELECT LEFT(PC.HIERARCHY,3) AS UPPER
    FROM PRODUCT_CAT PC
    INNER JOIN PRODUCT P ON P.PRODUCT_CATID=PC.PRODUCT_CATID
    WHERE P.IS_EXTRANET=1) AS H
    ON LEFT(PC.HIERARCHY,3)=H.UPPER 
GROUP BY PC.PRODUCT_CATID,PC.PRODUCT_CAT,PC.HIERARCHY
ORDER BY PC.HIERARCHY,PC.PRODUCT_CAT;

我不确定哪一个性能更好。小提琴是

对不起,你不是很清楚。哪些表有UNDER和SUB?理想情况下,您可以在问题中放入一些测试数据和相应的结果。@grahamj42在product_cat中,它是这样命名的,因为它有产品的类别,没有像under和sub这样的划分,只是层次结构不同,因此,按层次的顺序不同因此,如果查询选择了PC.HIERARCHY=100.001的行,是否要包括PC.HIERARCHY=100的行?这是一个字符字段NNN.NNN还是一个数字字段?@grahamj42 1是的,正好是2 nvarhar请看一下SQL Fiddle。我把你的查询输入到了与我对这个问题的理解相对应的数据中,结果成功了。也许你可以编辑小提琴并在评论中用新的URL回复——你甚至可以自己解决这个问题!对不起,你不是很清楚。哪些表有UNDER和SUB?理想情况下,您可以在问题中放入一些测试数据和相应的结果。@grahamj42在product_cat中,它是这样命名的,因为它有产品的类别,没有像under和sub这样的划分,只是层次结构不同,因此,按层次的顺序不同因此,如果查询选择了PC.HIERARCHY=100.001的行,是否要包括PC.HIERARCHY=100的行?这是一个字符字段NNN.NNN还是一个数字字段?@grahamj42 1是的,正好是2 nvarhar请看一下SQL Fiddle。我把你的查询输入到了与我对这个问题的理解相对应的数据中,结果成功了。也许你可以编辑小提琴并在评论中用新的URL回复——你甚至可以自己解决这个问题!但有一个小问题,它只对子类别进行分类,而不是子类别,因为如果有一个子类别中的产品具有is_extranet=1,那么该子类别下的所有子类别都会显示出来:希望我用union Ally解决了这一问题,但有一个小问题,它只对子类别进行分类,而不是子类别,因为如果子类别中有一个产品的is_extranet=1,那么该子类别下的所有子类别都将显示出来:希望我用union all解决了这个问题