MySQL 内联外联傻傻分不清楚

2014 年 9 月 27 日
 kofj
现在手里有三张数据表College(收藏记录数据,包含收藏记录id,收藏人uid,被收藏数据aid,时间time),Article(内容数据,包含数据aid,发布人uid,分类cid,时间time),User(用户数据,包含用户编号uid,用户名name,时间time),要求的是在收藏列表中中显示出当前用户的收藏记录。项目是使用ThinkPHP 3.2框架开发的。我个人并不精通数据库,为了避免自己写出错误的查询数据,使用了TP3.2的视图模型。自动生成的SQL查询语句是使用的jion(默认内联查询),也符合我的想法,如果College表里面的数据是无效的(在Article和User表中没有相对应的条件),那就捕猎出来收藏记录。

但是的但是,同事说我错了,弱爆了,这样是不对的,错的离谱,会少列出来很多数据。应该用LEFT JION来。

内联外联傻傻分不清楚,请各位赐教。
6045 次点击
所在节点    程序员
5 条回复
kchum
2014 年 9 月 27 日
随便搜,都有例子吧…
kofj
2014 年 9 月 27 日
@kchum 内联外联的概念我知道,关键是用法,我认为这种情况应该是内联查询,过滤掉无效数据,而不是LEFT JION列出所有的数据。
zts1993
2014 年 9 月 27 日
这个不是过滤的问题。。。
这是数据关系的问题。。


内连比如
A.id inner join b.in 一般来说,a.id 和 b.id 多为 一一对应 ,假设a.id 是用户, b表示他的详细信息。
其中b中每一个id只与a.id一个对应 ,select 每个人应该只有一条
外连的话,左右差不多我们以left join 举例
A.id left join b.in 就不一样了。比如a.id 是用户,b表示他的项目
每个人可能有很多project,那我select一个人的时候 使用left join可以直接找出 他所有的projec ,这种情况如果你用inner join肯定只能找一条,其实这样的查询有时可以改成子查询或者分步查询了,当然具体情况还要根据场景来看
asmore
2014 年 9 月 27 日
不一定非得用join吧,直接查询College, where 收藏人uid = 当前用户id

还快过程join
SoloCompany
2014 年 9 月 27 日
@zts1993 不要误导好不好,inner join 怎么变成只能用于一一对应了。

to 楼主,估计你这个用例能用上 left join 的 key 就只有 article.id <-> user.uid 了
left join 可以保证即使收藏的文章的作者挂了,也能列出来,这也没有啥不妥的地方(前提是你的数据无外键)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/136022

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX