在这种情况下,我有3个表:酒店,类别,hotel_category_infos。
表"酒店" :所有酒店的列表。
-----------------------
| id | name |
-----------------------
| 1 | Hotel England |
| 2 | Hotel Scotland |
| 3 | Hotel Ireland |
| 4 | Hotel Norway |
-----------------------
表格"类别" :可访问性类别列表(关于酒店对残障人士的可访问性)。可以分配酒店的可能类别,甚至不止一次。
--------------------------------------------------
| id | name |
--------------------------------------------------
| 1 | Ground floor without steps |
| 2 | Washing facilities wheelchair accessible |
| 3 | Special infrastructure on location |
--------------------------------------------------
表" hotel_category_infos" :酒店类别的实际分配,以及此酒店类别的其他精确描述。
-----------------------------------------------------------------------
| id | hotel_id | cat_id | description |
-----------------------------------------------------------------------
| 1 | 1 | 1 | No steps, except the one to the bla bla... |
| 2 | 1 | 2 | The entrance to the shower is 56cm wide... |
| 3 | 2 | 1 | The ramp at the entrance is 5% steep |
| 4 | 3 | 1 | Except on the terrace |
| 5 | 3 | 2 | Ask for rooms in the first floor |
| 6 | 3 | 3 | A indoor swimming pool is available for... |
-----------------------------------------------------------------------
我想做什么:
在搜索表单中,所有类别都列为复选框,因此在发送表单后,我有一个包含所有已检查类别ID的数组。我想列出所有分配到这些类别(不仅仅是其中一个)的酒店。
我尝试了什么:
e.g。选择所有在"底层没有步骤"和"洗涤设施"
SELECT
hotels.id
FROM
hotels INNER JOIN hotel_category_infos ON
hotel_category_infos.hotel_id = hotels.id AND
hotel_category_infos.cat_id IN (1,2)
但是IN()
- 部分表明只有一个类别必须匹配,而不是两者。我应该在SQL语句中改变什么?
答案 0 :(得分:0)
您需要进行两次比较,因为hotel_category_infos
的单行不会同时包含cat_id = 1
和cat_id = 2
。
SELECT id
FROM hotels
WHERE id IN (SELECT hotel_id FROM hotel_category_infos WHERE cat_id = 1)
AND id IN (SELECT hotel_id FROM hotel_category_infos WHERE cat_id = 2)
我在这里完全取消了联接,因为在你返回的领域没有必要。
答案 1 :(得分:0)
请注意,这绝不是有效的mysql语法。但是,它有望为您的问题提供动态解决方案。另请注意,您需要验证传入的数据以防止sql注入。
DECLARE p_Statement NVARCHAR(MAX)
SELECT p_Statement = 'SELECT id FROM hotels WHERE 1 = 1 '
for each p_catID in SelectedCatIds (loop) :
SELECT p_Statement = p_Statement + 'AND id IN (SELECT hotel_id FROM hotel_category_infos WHERE cat_id = p_catID '
(end loop)
PREPARE stmt FROM p_Statement
EXECUTE stmt
这将动态添加" AND id IN ..."为您的查询提供条款,从而缩小结果范围。