MySQL:如果在其中一个子记录中找到每个搜索条件,请选择记录

时间:2015-02-17 16:44:51

标签: mysql sql

在这种情况下,我有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语句中改变什么?

2 个答案:

答案 0 :(得分:0)

您需要进行两次比较,因为hotel_category_infos的单行不会同时包含cat_id = 1cat_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 ..."为您的查询提供条款,从而缩小结果范围。