1

ColdFusion と Mysql について質問があります。PRODUCT と PRODUCT_CAT の 2 つのテーブルがあります。としてマークされている特別な製品のいくつかを含むカテゴリをリストしたいと思います: 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>

そして出力:

<select name="product_catid">
    <option value="">All Categories</option>
    <cfoutput query="get_product_cat">
          <option value="#product_catid#" <cfif isdefined("attributes.product_catid") and len(attributes.product_catid) and (attributes.product_catid eq product_catid)>selected</cfif>><cfloop from="2" to="#listlen(hierarchy,'.')#" index="pc">&nbsp;&nbsp;</cfloop>#product_cat#</option>
    </cfoutput>
</select>

しかし問題がある。表の中product_catには、「下」と「下」の2種類のカテゴリーがあります。したがって、各「下」カテゴリ内には製品はありませんが、「サブ」カテゴリがあります。定義のある製品のみを含むカテゴリをリストしようとすると、is_extranet=1「下」のカテゴリがリストされません。しかし、「下」のカテゴリもリストしたいと思います。つまり、「サブ」カテゴリ内に定義のある製品がある場合is_extranet=1、「下」カテゴリを表示し、次にこれらの製品を含むサブカテゴリを表示します。私が明確だったことを願っています:)

さらに、「下」カテゴリの階層は次のようになります: 100 およびサブ: 100.001

4

1 に答える 1

1

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;

どちらが優れたパフォーマンスを発揮するかはわかりません。フィドルはこちら

于 2013-03-28T11:42:16.567 に答える