MySQL使用连接

时间:2017-02-21 21:27:18

标签: php mysql

我的数据库中有两个表,一个是articles,另一个是articleMedia article表存储标题和正文,而articleMedia存储附件,每篇文章可以有任意数量的附件,articleMedia表与articles表关联使用外键,这是artcle的id,所以我的表结构看起来像

文章表

----------------------------------
|id |title | body                |
----------------------------------
|1  |houses|some houses are green|

ArticleMedia表

----------------------------------
|id |articleFk | path             |
----------------------------------
|1  |2         |/media/1.jpg      |
|2  |2         |/media/house.mp4  |

我的查询技巧不太好,所以我的查询是

SELECT 
  article_tbl.id, title,body, articleMedia_tbl.path
FROM `article_tbl` 
JOIN articleMedia_tbl ON article_tbl.id = articleMedia_tbl.articleFk 

输出类似

的内容
------------------------------------------------------
|id | title | body | path         |                  |
------------------------------------------------------
|1  |houses|some houses are green |/media/1.jpg      |
------------------------------------------------------
|2  |houses|some houses are green |/media/house.mp4  |

有没有办法避免重复,或者我可以用什么更好的方法来避免这一切?

1 个答案:

答案 0 :(得分:0)

您指的是什么重复?您似乎具有1:N关系,其中文章可以包含任意数量的媒体。通过将文章连接到媒体,您可以将两个匹配关联起来。对于媒体表中的每个fk,您在文章表中匹配,因此重复;您的查询正是您想要的。您可以通过仅使用要查看的投影来更改投影(选定列)来隐藏重复项。

我所想的你正在接触的是JOINS更有趣的危险,那就是交叉加入。在它的核心,连接代表两个表的笛卡尔积。我们最多只加入1:N关系,因为我们可以从1方接受数据复制的需要。如果我们加入N:N,我们最终会得到两者之间的所有组合(例如A:A,A:B,B:A,B:B等)。这可以通过关联实体来解决。

要明确的是,你没有笛卡尔加入,但是,我发现这对我对联接的理解很有帮助:

http://www.databasejournal.com/features/mysql/article.php/3901221/Identifying-and-Eliminating-the-Dreaded-Cartesian-Product.htm