2012-03-02 79 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