Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql sql内部和左连接+;演出_Mysql_Database_Postgresql_Join - Fatal编程技术网

Mysql sql内部和左连接+;演出

Mysql sql内部和左连接+;演出,mysql,database,postgresql,join,Mysql,Database,Postgresql,Join,我有三张桌子: room room location 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_i

我有三张桌子:

room
room location
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
子句的一部分。在某些情况下,
外部连接
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;
此更改解决了返回
房间
中所有内容的问题,该问题通过
限制1
得到缓解。它还确保返回记录,即使
room\u stories
中没有
room\u id
的任何内容

希望这能让您在将来的查询中思考一些问题这样想:

ON
说明表之间的关系,例如

 ON room.id = room_story.room_id
其中
用于过滤,例如

 WHERE room.id = 67
另外,
JOIN
(或
internal JOIN
要求两个表中的匹配行都存在。
LEFT JOIN
表示右表中的匹配行可选缺失

把这些放在一起,我认为这就是你需要的:

FROM room r
INNER JOIN room_location rl  ON rl.room_id = r.id
INNER JOIN room_storys rs    ON rs.room_id = r.id
WHERE r.id = 67

这变得无关紧要(我认为):
LIMIT 1

您的联接在左侧和右侧的表之间没有关系。您是否在涉及的列上创建了索引?这些反勾号是一个语法错误。对于MySQL,它们不是。问题已经标记了MySQL(除了PostgreSQL,我同意),所以MySQL是我使用的格式,那么您应该使用标准SQL语法。只需省略背景标记,因为不需要引用这些标识符。