You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:46:14