MySQL一对多的数据关系增加了并发症

时间:2012-03-02 00:23:41

标签: mysql

我有一个数据库,其中有多个帖子。每个帖子可以与一个或多个位置相关联。然后,每个位置都与一个国家/地区相关联。

这可以通过四个表来处理:

  • 发布(使用idpost_title
  • postlocation(包含字段post_idlocation_id - 允许一对多的关系)
  • 位置(包含字段idlocation_titlecountry_id
  • 国家/地区(fieldsidcountry_title

我想执行一个简单有效的选择来检索帖子列表以及每个帖子的相关位置以及每个位置的国家/地区。

我不知道如何最好地实现这一点,任何帮助都会受到欢迎。谢谢。

1 个答案:

答案 0 :(得分: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子句的工作原理如下:左起一行   table根据join_condition匹配右表中的一行   行的内容被选为输出行。在左边排   表没有匹配它仍然被选中用于输出,但结合使用   右表中的“假”行,在所有列中包含NULL。   简而言之,MySQL LEFT JOIN子句允许您选择所有行   从左表开始,即使右边没有匹配   表

如果您有多个LEFT JOIN,那么在每种情况下,它使用累积结果到“左”表和您正在加入的表作为“右”表。

因此,上面的查询将为每个帖子/位置/国家/地区返回一行。请注意,这意味着可能会有多个行具有相同的post.*数据(每个postlocation一个与taht post关联的数据)。

如果帖子没有与之关联的帖子,则该帖子仍会显示在结果中(但location.*country.*的行为空)。同样,如果某个位置没有与之关联的国家/地区,则帖子/位置行仍会显示在输出中(但country.*的行为空)。这是LEFT JOIN的优点 - 你总是从“左”的表中获得所有行。