大廈從@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加入到實際編寫的內容?謝謝你的幫助。 –