我试图找到是否有任何答案但似乎找不到任何答案。我正在尝试将四个表连接在一起,但其中一个连接不在其他两个连接的表上,我已成功加入表中的三个我只是不确定加入第三个的语法。
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 :(得分: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;
答案 1 :(得分: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旨在忽略" white space" (数据除外)。重要的是简单地布置您的代码,以便于阅读...特别是对于后来可能需要弄清楚您在做什么的其他用户(尽管根据我的经验,当您返回一段代码时几年后,根本无法记住它。
(4)在每个ON
条款中,你是否怀疑a = b或b = a实际上并不重要。那是因为你没有设置一个与另一个相等,你要求它们已经相等,所以无论哪种方式都是相同的。
我对SQL初学者的建议是在编写SELECT
查询时(只读取并且不会更改任何数据):如果您不太确定则编写一些代码并将其设置为运行。如果它完全无效,您的软件应该会让您知道什么是错误的,不会造成任何伤害。如果它有效但错误,可能发生的最糟糕的事情就是你在数据库服务器上加了一些不必要的负载......如果运行需要很长时间并且你不期望它,那么你应该可以取消查询。只要您对结果看起来如何,以及大致预期的行数有所了解,您就不会出错。如果你完全陷入困境,请回到Stack Overflow。
如果您正在编写DELETE
个或UPDATE
个数据的代码,情况会有所不同。那么你想知道你到底要做什么。通常情况下,您可以先写一个密切相关的SELECT
语句,以确保您将完成所有并且只进行您期望的更改。如果发生最坏的情况,最好还是确保您有办法撤消更改。备份显然很好,您可以在进行任何更改之前创建自己的表备份副本。您不一定需要依赖备份软件或内部IT人员......根据我的经验,他们不喜欢数据库。
还有一些很棒的书。对于初学者,我推荐Ben Forta的任何内容,包括他的 SQL in 10 Minutes (' sa 每章图),或者他的 MySQL崩溃课程(虽然后者有点老了,所以在最近添加的MySQL功能上没有任何内容)。