V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
kofj
V2EX  ›  程序员

MySQL 内联外联傻傻分不清楚

  •  
  •   kofj ·
    kofj · 2014-09-27 16:54:56 +08:00 · 5122 次点击
    这是一个创建于 3711 天前的主题,其中的信息可能已经有所发展或是发生改变。
    现在手里有三张数据表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来。

    内联外联傻傻分不清楚,请各位赐教。
    5 条回复    2014-09-27 20:41:13 +08:00
    kchum
        1
    kchum  
       2014-09-27 17:07:04 +08:00 via iPhone
    随便搜,都有例子吧…
    kofj
        2
    kofj  
    OP
       2014-09-27 17:19:33 +08:00
    @kchum 内联外联的概念我知道,关键是用法,我认为这种情况应该是内联查询,过滤掉无效数据,而不是LEFT JION列出所有的数据。
    zts1993
        3
    zts1993  
       2014-09-27 19:37:06 +08:00
    这个不是过滤的问题。。。
    这是数据关系的问题。。


    内连比如
    A.id inner join b.in 一般来说,a.idb.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
        4
    asmore  
       2014-09-27 19:39:55 +08:00
    不一定非得用join吧,直接查询College, where 收藏人uid = 当前用户id

    还快过程join
    SoloCompany
        5
    SoloCompany  
       2014-09-27 20:41:13 +08:00
    @zts1993 不要误导好不好,inner join 怎么变成只能用于一一对应了。

    to 楼主,估计你这个用例能用上 left join 的 key 就只有 article.id <-> user.uid 了
    left join 可以保证即使收藏的文章的作者挂了,也能列出来,这也没有啥不妥的地方(前提是你的数据无外键)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1033 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 18:48 · PVG 02:48 · LAX 10:48 · JFK 13:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.