V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
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-06 11:09:43 +08:00 · 13704 次点击
    这是一个创建于 2938 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    第 1 条附言  ·  2016-11-06 12:47:44 +08:00
    好像我描述的有点问题:

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


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

    后来工作了发现 bullshit ,很多时候都要异构查询
    shawshi
        15
    shawshi  
    OP
       2016-11-06 12:48:07 +08:00
    @des 我想获取每编文章下的最新一条评论该怎么做?
    shawshi
        16
    shawshi  
    OP
       2016-11-06 12:48:58 +08:00
    @qiayue
    @YK46PTT 能否告知怎么个分两次查
    mringg
        17
    mringg  
       2016-11-06 12:51:38 +08:00 via iPhone   ❤️ 1
    右表先去重, group by 后 order by 根据 row number 取最新的一条评论
    shawshi
        18
    shawshi  
    OP
       2016-11-06 13:03:22 +08:00
    @mringg [group by] 只能取到第一条数据,但是那第一条数据不是最新的一条
    latyas
        19
    latyas  
       2016-11-06 13:07:59 +08:00
    对给定文章,评论表自增 id 最大和“最新”是否是一个意思? (前提是有自增 id 而不是 uuid 。。)
    fantasleotao
        20
    fantasleotao  
       2016-11-06 13:10:14 +08:00
    partition by
    des
        21
    des  
       2016-11-06 14:35:35 +08:00
    @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-06 14:41:01 +08:00
    需要用 window function ,比如 row number, first value 之类的
    msg7086
        23
    msg7086  
       2016-11-06 15:35:14 +08:00
    @des 关于一次搞定还分两次查的问题,建议跑一下看看性能如何,特别是修改数据导致 QueryCache 失效以后的性能。
    liujin834
        24
    liujin834  
       2016-11-06 15:56:45 +08:00
    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-07 03:59:04 +08:00
    这种用窗口函数都是最简单的问题,所以换用 postgresql 吧, mysql 的查询太弱了!
    liujin834
        26
    liujin834  
       2016-11-07 10:22:20 +08:00
    @reus 同意, mysql 感觉就像是积木玩具一样。。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3563 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 05:05 · PVG 13:05 · LAX 21:05 · JFK 00:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.