如何从数据库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 
+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

更改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

您需要使用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