加入三个表mysql

时间:2018-04-19 14:39:19

标签: mysql sql join

我有三张桌子:

房屋表

less

会议室表

id    title       description
--------------------------
1    Big House    Very big house
2    Small House  Very small house

Houses_Rooms表

id    title        room_status
--------------------------
1     Green  room  24
2     Yellow room  25
3     Blue   room  24

例如,我有房间状态 24。

我需要从房间表获取所有房屋房间 room_status = 24.但是,如果房屋 房间 room_status 不同我们不需要选择这个房子。

我构建了一些查询,并使用了id house_id room_id ------------------------- 1 1 1 2 2 3 3 1 2 。它有效,但返回的房屋具有相同的 room_status ,因为WHERE house.id IN (SELECT ...)

6 个答案:

答案 0 :(得分:1)

你似乎想要所有房间都有24的房屋。

WHERE house.id IN (SELECT ...)是个好主意。现在您需要一个子查询,其中只包含只有24个房间的房屋。

select *
from houses
where id in
(
  select hr.house_id
  from houses_rooms hr
  join rooms r on r.id = hr.room_id
  group by hr.house_id
  having min(r.room_status) = 24
     and max(r.room_status) = 24
);

然而,由于房屋根本不可能没有房间,我们可以简单地将房屋排除在非房地产的24间房间之外:

select *
from houses
where id not in
(
  select house_id
  from houses_rooms
  where room_id in (select id from rooms where status <> 24)
);

答案 1 :(得分:0)

以下查询选择所有拥有room_status = 24房间的房屋,但不包括同时拥有room_status&lt;&gt;的房屋。 24.它可能会进一步优化,但我的SQL有点生疏:

select h.*
from houses h
  join houses_rooms hr on h.id = hr.house_id
  join rooms r on hr.room_id = r.id
where r.room_status = 24
  and h.id not in (
    select h.id
    from houses h
      join houses_rooms hr on h.id = hr.house_id
      join rooms r on hr.room_id = r.id
    where r.room_status <> 24
  );

SQLFiddle Example

答案 2 :(得分:0)

您应该使用INNER JOIN代替子查询来进行此类查询。

SELECT
    HR.ID
    ,H.Title
    ,H.Description
    ,R.Title
FROM #House_Room HR
INNER JOIN #Houses H on HR.HouseID = h.ID
INNER JOIN #Rooms R on HR.RoomID = r.ID
WHERE R.RoomStatus = 24

返回:

1   |  Big House    |  Very big house    |  Green room
2   |  Small House  |  Very small house  |  Blue room

答案 3 :(得分:0)

试试这个:

VARIABLE2 = VARIABLE;

答案 4 :(得分:0)

这应该有效,因为它使用JOINS来获得有room_status = 24空间的人,然后使用NOT IN来排除那些拥有其他room statuses

SELECT * FROM Houses_Rooms hr
JOIN Houses h on hr.house_id = h.id
JOIN Rooms r on hr.room_id = r.id
WHERE r.room_status = 24
AND h.id NOT IN(
   SELECT h.house_id FROM Houses_Rooms h
   JOIN Rooms r on h.room_id = r.id 
   WHERE r.room_status <> 24  
)

答案 5 :(得分:0)

Select houses.title as 'house name'
From houses, rooms,houses_rooms
where houses.id=houses_rooms.house_id
and rooms.id=houses_rooms.room_id
and rooms.room_status=24

尝试这个..不是100%肯定..我通常不使用连接。