2017-04-25 96 views
0

我试图找到是否有任何答案,但似乎无法找到任何。我试图将四个表连接在一起,但其中一个连接不在另外两个连接所在的表上,我已经成功连接了三个表,我只是不确定加入第三个连接的语法。内连接内连接

SELECT * FROM 
nc_booking 
INNER JOIN 
nc_customer ON nc_booking.c_id = nc_customer.id 

INNER JOIN 
nc_propertys ON nc_booking.p_id = nc_propertys.id 

我该如何将nc_propertys连接到另一个表nc_owner?

+0

如果属性拥有所有者ID,那么您可以使用nc_owner加入它 – maSTAShuFu

+0

尽管您到目前为止所加入的所有表都与nc_booking表连接,但并不需要所有连接都是这样。它可能更像是一个'连锁',而不是'明星',如果这是你需要的和数据是如何相关的。 –

+0

谢谢,如果我试图加入另一张表到nc_booking我只需要一个新行并写入INNER JOIN等,我该如何正确地从propertys加入到实际编写的内容?谢谢你的帮助。 –

回答

0

大厦从@GordonLinoff的代码,你需要做的像添加额外的表:

SELECT * 
FROM nc_booking b INNER JOIN 
     nc_customer c 
     ON b.c_id = c.id INNER JOIN 
     nc_propertys p 
     ON b.p_id = p.id INNER JOIN 
     nc_owner o 
     ON o.id = p.o_id; 

您尚未分享我们需要使用连接额外表的列名,所以最后一行可能不正确。有几件事要注意...

(1)SELECT *不理想。如果您只需要特定的列,请列出它们。我一直坚持你的*,因为我不知道你想从桌子上得到什么。凡具有相同名称的列在每个表中存在,就得“完全限定”的字段名称如下...

SELECT c.id as customer_id, 
     -- more field can go here, with a comma after each 
     ... 

几个连接表中有一个id场,所以c.是必要的告诉数据库我们想要的是哪一个。注意,与表一样,我们也可以给字段一个'别名',在这种情况下'customer_id'。这对于演示非常有用,并且在将查询的输出用作较大代码片段时,这通常很重要。

(2)由于所有连接都是INNER JOINS,所以只要两个连接之间的连接保持不变,它就几乎没有(如果有的话)差别什么顺序。 (3)对于MySQL,从技术角度来说,不管你是否有很多新行或者根本没有。 SQL旨在忽略“空白区域”(数据内部除外)。重要的是简单地布置你的代码,这样很容易阅读......特别是对于后来可能需要弄清楚你在做什么的其他用户(尽管在我的经验中也适合你,当你返回一段代码时几年后,根本不记得它)。

(4)在每个ON子句中,实际上你是否说a = b或b = a并不重要。那是因为你没有设定一个等于另一个,你要求它们已经是平等的,所以它以任何方式相同。

我对SQL初学者的建议是当你编写一个SELECT查询(它只能读取并且不改变任何数据):如果你不太确定那么写一些代码并设置它运行。如果它完全无效,你的软件应该给你一些关于错误的概念,并且不会造成任何损害。如果它是有效的但是错误的,最糟糕的情况是你在数据库服务器上放了一些不必要的负载......如果它需要很长时间才能运行并且你没有预料到它,那么你应该能够取消查询。只要你对你期望的结果有一些了解,并且大概有多少行,你就不会错。如果你完全卡住回来这里堆栈溢出。

如果您正在编写的代码是DELETE s或UPDATE的数据,情况会有所不同。然后你想知道你正在做什么。通常情况下,您可以先写一个密切相关的SELECT声明,以确保您将进行所有且仅有的所期望的更改。最好还是确保在最坏的情况发生时你有办法撤销你的改变。备份显然是很好的,并且在进行任何更改之前,您经常可以创建自己的表的备份副本。您不一定需要依赖备份软件或您的内部IT人员......根据我的经验,他们无论如何都不喜欢数据库。

也有一些伟大的书在那里。对于初学者,我会推荐Ben Forta的任何东西,包括他的SQL在10分钟内(这是一个每章的数字),或者他的MySQL的速成班(后者虽然有点老,没有任何关于MySQL最近添加的功能)。

+0

史蒂夫,我无法感谢你,我非常感谢你的帮助!我一定会在船上听取您的建议,并且我将着手让您获得Ben Forta提到的这本书!再次感谢您的帮助! –

1

你的语法看起来不错。我提供了一个答案,因为你真的应该学会使用表别名。他们能够更方便的查询写入和读取:

SELECT * 
FROM nc_booking b INNER JOIN 
    nc_customer c 
    ON b.c_id = c.id INNER JOIN 
    nc_propertys p 
    ON b.p_id = p.id; 
+0

非常感谢您的帮助! –