大厦从@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最近添加的功能)。
如果属性拥有所有者ID,那么您可以使用nc_owner加入它 – maSTAShuFu
尽管您到目前为止所加入的所有表都与nc_booking表连接,但并不需要所有连接都是这样。它可能更像是一个'连锁',而不是'明星',如果这是你需要的和数据是如何相关的。 –
谢谢,如果我试图加入另一张表到nc_booking我只需要一个新行并写入INNER JOIN等,我该如何正确地从propertys加入到实际编写的内容?谢谢你的帮助。 –