MySQL多表关联查询问题:按指定Location获取酒店全部关联位置
嗨,我明白你的需求了——你想要找到关联了指定Location的酒店,然后把该酒店所有的关联位置记录都查出来,而不是仅仅返回和指定Location匹配的那一条。咱们来一步步解决这个问题:
先明确你的表结构
先把你给出的三张表整理得更清晰些(假设HOTEL_LOCATION的两列分别是hotel_id和location_id):
- HOTEL表(存储酒店ID):
+-------+ | HOTEL | +-------+ | 1 | | 2 | | 3 | | 4 | | 5 | +-------+
- LOCATION表(存储位置ID):
+----------+ | LOCATION | +----------+ | 1 | | 2 | | 3 | | 4 | | 5 | +----------+
- HOTEL_LOCATION表(酒店与位置的关联关系):
+-----------------+ | HOTEL_LOCATION | +-----------------+ | 1 | 1 | | 1 | 2 | | 1 | 3 | | 2 | 4 | | 3 | 5 | +-----------------+
问题出在哪?
你当前的查询大概率是类似这样的:
SELECT * FROM HOTEL_LOCATION WHERE location_id = 1;
这个语句只会筛选出location_id=1的单条记录,但你需要的是先定位到关联了指定位置的酒店,再返回该酒店的全部关联位置,而不是只返回匹配的那一条。
三种可行的解决方案
方法1:用子查询获取符合条件的酒店ID
SELECT * FROM HOTEL_LOCATION WHERE hotel_id IN ( -- 先找到所有关联了指定Location的酒店ID SELECT hotel_id FROM HOTEL_LOCATION WHERE location_id = 1 );
逻辑很直观:先通过子查询找出关联了location_id=1的酒店(这里就是酒店1),再查询该酒店的所有关联位置记录。
方法2:自连接表实现关联查询
SELECT hl_all.* FROM HOTEL_LOCATION hl_match -- 自连接找到同一酒店的所有位置记录 JOIN HOTEL_LOCATION hl_all ON hl_match.hotel_id = hl_all.hotel_id WHERE hl_match.location_id = 1;
这里把HOTEL_LOCATION表自连接,先定位到匹配指定位置的记录(hl_match),再关联到该酒店的所有位置记录(hl_all)。
方法3:用EXISTS子句做存在性判断
SELECT hl_all.* FROM HOTEL_LOCATION hl_all WHERE EXISTS ( -- 判断当前记录的酒店是否关联了指定Location SELECT 1 FROM HOTEL_LOCATION hl_match WHERE hl_match.hotel_id = hl_all.hotel_id AND hl_match.location_id = 1 );
这个逻辑是:遍历每条酒店位置记录,检查是否存在同一酒店且关联了指定位置的记录,存在则返回这条记录。
验证结果
执行以上任意一种查询,当指定location_id=1时,都会得到你期望的结果:
+-----------------+ | HOTEL_LOCATION | +-----------------+ | 1 | 1 | | 1 | 2 | | 1 | 3 | +-----------------+
内容的提问来源于stack exchange,提问作者Adi Saputra
相关产品推荐
相关产品推荐

