mysql - 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?
解决方案
每种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
希望这能让您在未来的查询中有所思考
推荐阅读
- kubernetes - CoreDNS 将所有 DNS 查询转发到本地路由器,包括集群内服务名称的查询
- javascript - Swiper.js 分页自定义项目符号不会点击移动到下一张幻灯片
- linux - 使用 signal_pending_state 函数将任务状态更改为 TASK_RUNNING
- azure-sql-database - Web 应用程序和 SQL Server 之间的白名单 IP
- javascript - 如何使用 discord.js 获取 URL 的信息
- java - Eclipse MAT OQL 某个包中的类列表
- javascript - 以角度显示从 ngx-data-table 中选择的用户详细信息
- html - 将文本放在 div 的中心,同时忽略其中的其他元素
- python - 将实例列表放入数据框中,但一个属性是另一个字典列表
- python - 无论我做什么,超级简单的 Flask 应用程序的云构建都失败了