首页 > 解决方案 > sql 内连接和左连接 + 性能

问题描述

我有 3 张桌子:

room
room location
room_storys

如果有人创建房间,每次都会自动排到房间位置。room_storys 表可以是空的。

现在我想内部加入表格。

如果我这样做,我不会得到任何结果:

SELECT
r.name, 
r.date, 

rl.city, 
rl.street, 
rl.number, 
rl.name,

rs.source,
rs.date

FROM room r

INNER JOIN room_location rl
ON rl.room_id = 67

INNER JOIN room_storys rs
ON rs.room_id = 67

LIMIT 1;

如果我这样做:

INNER JOIN room_storys rs
ON rs.room_id = 67

对此:

LEFT JOIN room_storys rs
ON rs.room_id = 67
```

then it works. But I heard that left join has no good performance, how you would perform this query above? Or is that okey?

标签: mysqldatabasepostgresqljoin

解决方案


每种JOIN类型都有其优点和缺点,但是对于像您这样的查询,“成本”可以忽略不计。一个建议是让表相互引用而不是id作为ON子句的一部分引用。OUTER JOIN在某些情况下,特异性可能对 s 至关重要。您的查询可以这样写:

SELECT r.`name`, 
       r.`date`, 

       rl.`city`, 
       rl.`street`, 
       rl.`number`, 
       rl.`name`,

       rs.`source`,
       rs.`date`
  FROM `room` r INNER JOIN `room_location` rl ON r.`id` = rl.`room_id`
           LEFT OUTER JOIN `room_storys` rs ON rl.`room_id` = rs.`room_id`
 WHERE r.`id` = 67;

此更改解决了返回所有内容的问题room,而LIMIT 1. 它还确保返回记录,即使room_stories.room_id

希望这能让您在未来的查询中有所思考


推荐阅读