mysql left join 右表存在重复数据,怎么处理? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
shawshi
V2EX    MySQL

mysql left join 右表存在重复数据,怎么处理?

  •  
  •   shawshi
    shi1991 2016 年 11 月 6 日 14265 次点击
    这是一个创建于 3457 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我有两张表, A 表为文章, B 表为评论表。 我想通过 A 表关联 B 表,并取 B 表最新的评论内容?

    我看到网上有说使用 max(id) 然后对 A 表 in ( max(id)),我感觉这样在 A 表内容很多的时候会存在性能问题,不知有没有其他解决方法。

    第 1 条附言    2016 年 11 月 6 日
    好像我描述的有点问题:

    A 表文章, B 表评论。
    我想获取每个文章下的最新一条评论该怎么做?
    26 条回复    2016-11-07 10:22:20 +08:00
    mzsongyan
        1
    mzsongyan  
       2016 年 11 月 6 日 via iPhone
    用 order by 啊
    shawshi
        2
    shawshi  
    OP
       2016 年 11 月 6 日
    @mzsongyan 单独通过 order by 是没发去除重复的。我去除重复一般使用 ```GROUP BY```做的。但是 ```GROUP BY ``` 是先去重在排序。这样 B 表取不到最新的值。
    mzsongyan
        3
    mzsongyan  
       2016 年 11 月 6 日 via iPhone
    不明白评论还有重复的……
    mzsongyan
        4
    mzsongyan  
       2016 年 11 月 6 日 via iPhone
    可以试试 distinct
    shawshi
        5
    shawshi  
    OP
       2016 年 11 月 6 日
    @mzsongyan A 表和 B 表是 一对多的关系。一个文章可以有多个评论
    qiayue
        6
    qiayue  
    PRO
       2016 年 11 月 6 日
    分两次查询不好吗
    shawshi
        7
    shawshi  
    OP
       2016 年 11 月 6 日
    @qiayue 说个思路我想一下
    des
        8
    des  
       2016 年 11 月 6 日 via Android
    @qiayue 一次就能搞定的还得分两次查?
    @shawshi 讲真,我真不明白怎么个重复法,你要取最新的一条用 top 不就完了吗?
    如果是内容有重复的,那是你自己的的问题吧?或者用户卡了多刷新了一下
    GGGG430
        9
    GGGG430  
       2016 年 11 月 6 日
    增加一个 redis 做缓存怎么样, 一分钟刷新一次最新评论
    qiayue
        10
    qiayue  
    PRO
       2016 年 11 月 6 日
    @des 没有好坏之分,不同的场合用不同的办法
    如果数据量太大或者访问量大的情况下,分两次查询,再配合缓存,效果绝对比一次查询好。
    YK46PTT
        11
    YK46PTT  
       2016 年 11 月 6 日
    @qiayue 说的对,分 2 次查询。
    xzem
        12
    xzem  
       2016 年 11 月 6 日
    >A 表和 B 表是 一对多的关系。一个文章可以有多个评论


    这个只是多个评论不算是重复吧? 也不用去重啊, 想取最新的评价直接 order by 不就行了?
    latyas
        13
    latyas  
       2016 年 11 月 6 日
    谁是右表?评论表?用什么键关联
    latyas
        14
    latyas  
       2016 年 11 月 6 日
    @des 上学的时候我觉得 良范式化的结构设计可以在很多场景下一次把数据查出来

    后来工作了发现 bullshit ,很多时候都要异构查询
    shawshi
        15
    shawshi  
    OP
       2016 年 11 月 6 日
    @des 我想获取每编文章下的最新一条评论该怎么做?
    shawshi
        16
    shawshi  
    OP
       2016 年 11 月 6 日
    @qiayue
    @YK46PTT 能否告知怎么个分两次查
    ming2050
        17
    ming2050  
       2016 年 11 月 6 日 via iPhone   1
    右表先去重, group by 后 order by 根据 row number 取最新的一条评论
    shawshi
        18
    shawshi  
    OP
       2016 年 11 月 6 日
    @mringg [group by] 只能取到第一条数据,但是那第一条数据不是最新的一条
    latyas
        19
    latyas  
       2016 年 11 月 6 日
    对给定文章,评论表自增 id 最大和“最新”是否是一个意思? (前提是有自增 id 而不是 uuid 。。)
    fantasleotao
        20
    fantasleotao  
       2016 年 11 月 6 日
    partition by
    des
        21
    des  
       2016 年 11 月 6 日
    @shawshi
    这样如何
    SELECT * FROM users LEFT JOIN (SELECT uid,post,max(time) AS time FROM post GROUP BY uid) USING(uid);
    mliilm
        22
    mliilm  
       2016 年 11 月 6 日
    需要用 window function ,比如 row number, first value 之类的
    msg7086
        23
    msg7086  
       2016 年 11 月 6 日
    @des 关于一次搞定还分两次查的问题,建议跑一下看看性能如何,特别是修改数据导致 QueryCache 失效以后的性能。
    liujin834
        24
    liujin834  
       2016 年 11 月 6 日
    SELECT n.*,(SELECT c.* FROM comment c WHERE n.id=c.id ORDER BY c.id DESC LIMIT 1) FROM news n
    reus
        25
    reus  
       2016 年 11 月 7 日
    这种用窗口函数都是最简单的问题,所以换用 postgresql 吧, mysql 的查询太弱了!
    liujin834
        26
    liujin834  
       2016 年 11 月 7 日
    @reus 同意, mysql 感觉就像是积木玩具一样。。。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2410 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 65ms UTC 16:07 PVG 00:07 LAX 09:07 JFK 12:07
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86