2011-05-27 22 views
1

我在這裏有3張桌子。如何從數據庫MySQL中獲取正確的複選框結果?

1)酒店

----------------- 
|Hotel_ID | Name  | 
----------------- 
| 1 |Shangrila | 
---------------------- 
| 2 |GoldHill | 
---------------------- 
| 3 |BayBeach | 
---------------------- 

2)功能

---------------------- 
|Feature_ID| Feature | 
---------------------- 
|  1 | Goft | 
---------------------- 
|  2 |Internet | 
---------------------- 

3)Brdige_Hotel_Feature

------------------------ 
|Hotel_ID | Feature_ID | 
------------------------ 
| 1 |  1  | 
------------------------ 
| 1 |  2  | 
----------------------- 
|  2 |  1  | 
----------------------- 

這意味着每家酒店可能有超過1種功能。

我的想法是這樣的,我們說,如果我要得到表3 Bridge_Hotel_Feature結果。 如果FEATURE_ID = 1,我得到 酒店1和2 **如果FEATURE_ID = 1,2,我只是想獲得 酒店1. 但我總是得到兩個HOTEL_ID 1和2 ** 請幫助我解決方案,只與Hotel_ID匹配。

下面是代碼我嘗試。

SELECT h.Name , h.Hotel_ID, f.feature 
FROM Hotel h, Bridge1_Hotel_Features b, Features f 
where 0=0 
AND b.Feature_ID = f.Feature_ID 
AND b.Hotel_ID = r.Hotel_ID 

<cfif #FORM.Feature_ID# IS NOT ""> 
    AND f.Feature_ID IN (#FORM.Feature_ID#) 
</cfif> 

回答

0

如果FEATURE_ID = 1,2,結果必然 只有 GET HOTEL_ID = 1

因爲只有HOTEL_ID = 1具有兩個特徵,正確嗎?假設#FORM.Feature_ID#不包含重複項,請使用HAVING子句動態識別包含所有請求功能的酒店。

SELECT Hotel_ID, COUNT(Feature_ID) AS FeatureCount 
FROM Bridge_Hotel_Feature 
<!--- find matching features ---> 
WHERE Feature_ID IN (<cfqueryparam value="#FORM.Feature_ID#" cfsqltype="cf_sql_integer" list="true">) 
GROUP BY Hotel_ID 
<!--- having ALL of the requested features ---> 
HAVING COUNT(Feature_ID) = <cfqueryparam value="#listLen(FORM.Feature_ID)#" cfsqltype="cf_sql_integer"> 

然後,您可以將其作爲派生表或可能的子查詢連接到它。在SQL需要進行優化,但在概念上類似於

SELECT h.Hotel_ID, h.Name, f.Feature 
FROM Hotel h 
     INNER JOIN Bridge_Hotel_Feature b ON b.Hotel_ID = h.Hotel_ID 
     INNER JOIN Features f ON b.Feature_ID = f.Feature_ID 
     INNER JOIN 
     (
     SELECT Hotel_ID, COUNT(Feature_ID) AS FeatureCount 
     FROM Bridge_Hotel_Feature 
     <!--- find matching features ---> 
     WHERE Feature_ID IN (<cfqueryparam value="#FORM.Feature_ID#" cfsqltype="cf_sql_integer" list="true">) 
     GROUP BY Hotel_ID 
     <!--- having ALL of the requested features ---> 
     HAVING COUNT(Feature_ID) = <cfqueryparam value="#listLen(FORM.Feature_ID)#" cfsqltype="cf_sql_integer"> 
    ) ck ON ck.Hotel_ID = h.Hotel_Id 
+0

首先謝謝你,我已經嘗試了你給我的第一個代碼。 但我沒有得到任何結果,即使只勾選1框。 順便說一下,我可以知道COUNT(Feature_ID)AS FeatureCount的用途嗎?因爲它沒有連接下面的代碼。 – Raywin 2011-05-27 17:31:24

+0

@Raywin - 使用FORM.Feature_ID =「1,2」'第一個查詢返回Hotel_ID 1.你可以發佈你的sql嗎? COUNT(Feature_ID)用於僅查找具有* all *所選特徵的記錄。 – Leigh 2011-05-27 17:39:35

+0

Leigh,謝謝,如果剛剛按照你的第一個代碼,我可以得到答案,當我嘗試只添加餐廳r,然後我無法得到任何答案。 (Feature_ID)= 2)ck ON ck.Restaurant_ID = r.Restaurant_I – Raywin 2011-05-27 17:48:01

0

更改SQL語句:

SELECT h.Name , h.Hotel_ID, f.feature 
FROM Hotel h, Bridge1_Hotel_Features b, Features f 
where b.Feature_ID = f.Feature_ID 
     AND b.Hotel_ID = h.Hotel_ID 

<cfif #FORM.Feature_ID# IS NOT ""> 
    AND b.Feature_ID IN (#FORM.Feature_ID#) 
</cfif> 

從本質上講,where子句應限制在Bridge_Hotel_Features表FEATURE_ID的可選部分。

+1

你不需要周圍的變量名##在CFIF聲明。你真的應該使用表格變量 – duncan 2011-05-27 16:25:47

+0

上的cfqueryparam謝謝大家,我更改爲 和b.Feature_ID IN(#FORM.Feature_ID#)。 但結果我仍然得到兩個。 如果Feature_ID = 1,2,結果只能得到Hotel_ID = 1。 – Raywin 2011-05-27 16:31:54

+0

在這種情況下,請展開form.feature_id變量: – 2011-05-27 16:43:23

0

您需要使用EXIST來解決此問題。

SELECT h.Name , h.Hotel_ID, f.feature 
FROM Hotel h, Bridge_Hotel_Feature b, Feature f 
where b.Feature_ID = f.Feature_ID 
     AND b.Hotel_ID = h.Hotel_ID 
AND EXISTS (SELECT feature_id FROM bridge_hotel_feature WHERE feature_id = 1 AND bridge_hotel_feature.hotel_ID = h.hotel_ID) 
AND EXISTS (SELECT feature_id FROM bridge_hotel_feature WHERE feature_id = 2 AND bridge_hotel_feature.hotel_ID = h.hotel_ID) 

編輯:以上是你的查詢需要什麼樣子的例子。爲了使其動態化,您將添加一個循環。

我沒有經驗的ColdFusion自己,所以我不能告訴你逐字如何處理代碼來執行。

但你需要做的是包裝的下面的一段代碼在一個循環中,並附加給你的查詢字符串每個複選框以及與每個複選框的FEATURE_ID where子句中更換FEATURE_ID。 AND EXISTS (SELECT feature_id FROM bridge_hotel_feature WHERE feature_id = 1 AND bridge_hotel_feature.hotel_ID = h.hotel_ID)

我希望這是更清楚你。

+0

我嘗試了他的代碼,但是如果我的複選框勾選了多於一個框,它就會出錯。 – Raywin 2011-05-27 17:09:53

+0

什麼是錯誤信息?另外,功能是否動態?即將有超過2個功能 – Leigh 2011-05-27 17:46:05

+0

Erm ..因爲這個問題只是一個簡單的例子,但代碼有一個複選框,並可能打勾超過1個框。對不起,如果只是按照代碼,沒有錯誤,並得到結果,對於錯誤 – Raywin 2011-05-27 18:04:45

相關問題