我的数据库中有两个表,一个是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 |
有没有办法避免重复,或者我可以用什么更好的方法来避免这一切?
答案 0 :(得分:0)
您指的是什么重复?您似乎具有1:N关系,其中文章可以包含任意数量的媒体。通过将文章连接到媒体,您可以将两个匹配的关联起来。对于媒体表中的每个fk,您在文章表中匹配,因此重复;您的查询正是您想要的。您可以通过仅使用要查看的投影来更改投影(选定列)来隐藏重复项。
我所想的你正在接触的是JOINS更有趣的危险,那就是交叉加入。在它的核心,连接代表两个表的笛卡尔积。我们最多只加入1:N关系,因为我们可以从1方接受数据复制的需要。如果我们加入N:N,我们最终会得到两者之间的所有组合(例如A:A,A:B,B:A,B:B等)。这可以通过关联实体来解决。
要明确的是,你没有笛卡尔加入,但是,我发现这对我对联接的理解很有帮助: