我有一个似乎无法找到解决方案的问题。我在这里浏览了类似的答案,但是没有什么正是我想要的。我对SQL非常熟悉,但无论如何都不是专家。

我有一个表格,其中包含有关公寓楼的信息-名称,区域,邻里,电话号码,地址,邮政编码等。目前,我在此表中定义了一些便利设施,例如“门卫”,“电梯”,“健身房”(和其他少数几个)作为tinyints表示建筑物是否确实具有这种舒适性。但是,我正在合并更多的便利设施类型,并且我认为这可能是时候更改结构了,因为在庞大的建筑物表中添加一列没有太大意义。

因此,我正在寻找一种解决方案,该解决方案将为我提供以下方面的最佳能力:
1)根据用户定义的便利设施搜索建筑物(例如,用户选择要查看必须具有健身房和看门人的建筑物,而不关心其他建筑物)
2)返回有关建筑物的数据,包括建筑物包含的所有便利设施(用于显示信息)

我正在考虑将这些结构分成多对多关系,并执行以下操作:
1)创建一个包含所有便利设施的名为“便利设施”的新表,其结构如下:
    id->便利设施的唯一ID
    名称->便利设施的文字说明
    值->例如“ pet_friendly”(用于搜索表单,不确定是否需要)

2)在另一个具有以下结构的表“ building_amenities”中创建建筑物与设施之间的关系表:
    id->关系的唯一ID
    building_id->指建筑物的ID
    amenity_id->表示便利设施的ID
    值-> tinyint,建筑物是否具有舒适性
在此表中,每个建筑物与每个便利设施都有关系,并指示其是否拥有。

我的问题是,我不确定这是否适用于这种情况,并且我当然不知道如果拥有这种结构该如何实现搜索查询。

非常感谢您对此提供的任何帮助!

最佳答案

我建议您创建建筑表,便利设施表和关系表。每个建筑物以及每个便利设施都有一个ID。要选择存在某些便利设施的所有建筑物,只需编写如下查询

SELECT *
FROM (relational_table) rt JOIN (buildings_table) bt
    ON rt.id_building = bt.id_building JOIN (amenities_table) at
    ON at.id_amenity = rt.id_amenity
WHERE rt.id_amenity = ... (OR, AND etc.)


要返回带有其便利设施的建筑物,只需将WHERE子句更改为WHERE id_building = x,然后应选择所有便利设施。

08-15 19:48