2012-03-02 78 views
1

我有一個數據庫中有多個職位。每個帖子可以與一個或多個位置相關聯。然後每個位置與一個國家相關聯。MySQL與一對多的數據關係增加併發症

這是通過四個表處理:

  • 柱(用idpost_title
  • postlocation(與領域post_idlocation_id - 允許一對多的關係)
  • 位置(與領域id,location_titlecountry_id
  • 國家(與fields,idcountry_title

我想執行一個簡單,有效的選擇來獲取職位,每個人的相關位置和每個那些位置國家的名單。

我不知道如何最好地實現這一點,任何幫助將是最受歡迎的。謝謝。

回答

0

使用LEFT JOIN

SELECT post.*, location.*, country.* 
FROM post 
LEFT JOIN postlocation ON post.id = postlocation.post_id 
LEFT JOIN location ON postlocation.location_id = location.id 
LEFT JOIN country ON location.country_id = country.id 

以下是LEFT JOIN作品的解釋:http://www.mysqltutorial.org/mysql-left-join.aspx

MySQL的LEFT JOIN子句是這樣工作的:當從左側 表中的行匹配的行從基於join_condition的右表中選擇 行的內容作爲輸出行。當左邊的 表中的行沒有匹配時,它仍然被選中用於輸出,但是與 合併在右表中包含所有列中的NULL的「假」行。 總之,MySQL LEFT JOIN子句允許您從左表中選擇所有行 ,即使它們在右表 中沒有匹配。

當您有多個LEFT JOIN時,那麼在每種情況下,它將使用累計結果,直到「左」表和您加入的表爲「右」表。

因此,上面的查詢將爲每個帖子/位置/國家返回一行。請注意,這意味着將有數個行可能具有相同的post.*數據(每個postlocation與該帖子相關聯)。

如果帖子沒有與其關聯的帖子,該帖子仍然會顯示在結果中(但空行爲location.*country.*)。同樣,如果一個位置沒有國家將它與它關聯,那麼帖子/位置行將仍然顯示在輸出中(但對於country.*爲空行)。這是LEFT JOIN的優點 - 您始終可以從左側的表格中獲取所有行。

+0

這是完美的 - 正是我以後。非常感謝你的幫助。 – 2012-03-02 10:53:27