我这里有3张桌子。
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 :(得分: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 :(得分: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)
编辑:以上是您的查询需要的示例。为了使它动态化,你将添加一个循环。
我自己没有冷融经验所以我不能逐字告诉你如何处理该代码。
但是您需要做的是将以下代码段包装在循环中,并将其附加到每个复选框的查询字符串中,并将where子句中的feature_id替换为每个复选框的feature_id。
AND EXISTS (SELECT feature_id FROM bridge_hotel_feature WHERE feature_id = 1 AND bridge_hotel_feature.hotel_ID = h.hotel_ID)
我希望这能让你更清楚。
答案 2 :(得分:0)
如果Feature_ID = 1,2,则结果必须 仅获取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