如何从数据库MySQL中获取正确的复选框结果?
我在这里有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>
如果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
更改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的可选部分。
您需要使用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)
我希望这是更清楚你。
首先谢谢你,我已经尝试了你给我的第一个代码。 但我没有得到任何结果,即使只勾选1框。 顺便说一下,我可以知道COUNT(Feature_ID)AS FeatureCount的用途吗?因为它没有连接下面的代码。 – Raywin 2011-05-27 17:31:24
@Raywin - 使用FORM.Feature_ID =“1,2”'第一个查询返回Hotel_ID 1.你可以发布你的sql吗? COUNT(Feature_ID)用于仅查找具有* all *所选特征的记录。 – Leigh 2011-05-27 17:39:35
Leigh,谢谢,如果刚刚按照你的第一个代码,我可以得到答案,当我尝试只添加餐厅r,然后我无法得到任何答案。 (Feature_ID)= 2)ck ON ck.Restaurant_ID = r.Restaurant_I – Raywin 2011-05-27 17:48:01