2011-12-23 54 views
0
我有鑽了一些數據的麻煩

,這是表結構鑽取數據的ColdFusion

產品表

uid_product(唯一ID)

txt_prod_name(產品名稱)

表名稱:tbl_products

產品Featu RES

uid_feature(唯一ID)

txt_feature_name(功能名稱)表名稱:tbl_features

分配產品特點

uid_prodf(唯一ID)

uid_prodf_prodid(外鍵to uid_product)

uid_p rodf_featid(外鍵uid_features)

表名:tbl_prod_features

一種產品可以有很多的功能,所以使用tbl_prod_features表。

我創建了以下查詢,以獲得結果;

<cfquery name="getFeatureProducts" datasource="#application.dsn#"> 
SELECT uid_product, txt_prod_name 
FROM dbo.tbl_products 
WHERE uid_product IN (SELECT (dbo.tbl_product_features.uid_prodf_prodid) 
FROM dbo.tbl_product_features 
WHERE uid_prodf_featid IN (<cfqueryparam cfsqltype="CF_SQL_INTEGER" value="#arguments.uid_features#" list="yes">)) 
ORDER BY dbo.tbl_products.txt_prod_name 
</cfquery> 

這適用於獲取與最終用戶選擇的功能相關的所有產品。然而,我需要實現的是以下內容:

如果用戶選擇;

特點A = 5成的產品顯示(3超過了這些產品的5包含特徵B)

如果用戶隨後選擇;

特徵B = 3產品

與目前使用的運營商還是會恢復5個產品查詢。

我的第一個想法是創建一個動態where語句添加AND運算符,但是uid_prodf_featid = 5 AND uid_prodf_featid = 6總是會產生0個結果。

我的第二個想法是從第一次鑽取產生id的數組,即得到前5個產品的id,然後將它們傳遞給查詢,然後深入查詢這些特徵,這些工作和正確的結果被獲得。

但是,用戶有能力刪除功能(以任何順序),所以我會不知何故需要跟蹤產品ID的時間和時間,他們被添加和刪除。

我相信我過於複雜,但任何幫助,將不勝感激。

回答

1

使用HAVING條款來算的匹配特徵的數量和只返回有所有要求的功能產品。

例如,如果arguments.uid_features總是包含獨特特徵的ID,你可以做這樣的事情:

SELECT p.uid_product, p.txt_prod_name 
FROM tbl_products p INNER JOIN tbl_product_features f 
      ON p.uid_product = f.uid_prodf_prodid 
WHERE f.uid_prodf_featid IN (<cfqueryparam cfsqltype="CF_SQL_INTEGER" value="#arguments.uid_features#" list="true">) 
GROUP BY p.uid_product, p.txt_prod_name 
HAVING COUNT(f.uid_prodf_featid) = <cfqueryparam cfsqltype="CF_SQL_INTEGER" value="#ListLen(arguments.uid_features)#"> 
ORDER BY p.txt_prod_name 
+0

謝謝您!你已經拯救了我的聖誕節!現在我一直在複雜化它!這是一個偉大的網站和偉大的人誰使用它!這工作完美!!!!!!!!!!!!!謝謝 – 2011-12-23 21:26:48

+0

歡迎您和聖誕快樂:) – Leigh 2011-12-23 21:45:44

+0

聖誕快樂! – 2011-12-23 21:48:55

0

我認爲這可能會更好。首先,它擺脫了子選擇。其次,它會篩選所選功能ID,然後按相關功能對產生的產品進行分組。

SELECT 
    a.uid_feature, 
    a.txt_feature_name, 
    c.uid_product, 
    c.txt_prod_name 
FROM 
    tbl_features a 
INNER JOIN 
    tbl_prod_features b 
    ON 
     b.uid_prodf_featid = a.uid_feature 
     <cfif listLen(arguments.uid_features) NEQ 0> 
      AND 
      a.uid_feature IN (<cfqueryparam cfsqltype="CF_SQL_INTEGER" value="#arguments.uid_features#" list="yes">) 
     </cfif> 
INNER JOIN 
    tbl_products c ON c.uid_product = b.uid_prodf_prodid 
GROUP BY 
    a.uid_feature 
ORDER BY 
    c.txt_prod_name
+0

您好感謝您迴應,但我得到以下錯誤 [Macromedia公司] [SQLServer的JDBC驅動程序] [SQLServer]列'tbl_features.txt_feature_name'在選擇列表中無效,因爲它不包含在聚合函數或GROUP BY子句中。 傑森 – 2011-12-23 16:37:22

+0

我有你的查詢工作,但這給了我錯誤的結果,它不給我產品的鞦韆和幻燈片它給了我所有產品的鞦韆或幻燈片,我需要它來生產產品的鞦韆和幻燈片 – 2011-12-23 17:16:51