› 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 · Nov 6, 2016 · 14658 views
    This topic created in 3613 days ago, the information mentioned may be changed or developed.

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

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

    Supplement 1  ·  Nov 6, 2016
    好像我描述的有点问题:

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


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

    后来工作了发现 bullshit ,很多时候都要异构查询
    shawshi
        15
    shawshi  
    OP
       Nov 6, 2016
    @des 我想获取每编文章下的最新一条评论该怎么做?
    shawshi
        16
    shawshi  
    OP
       Nov 6, 2016
    @qiayue
    @YK46PTT 能否告知怎么个分两次查
    ming2050
        17
    ming2050  
       Nov 6, 2016 via iPhone   ❤️ 1
    右表先去重, group by 后 order by 根据 row number 取最新的一条评论
    shawshi
        18
    shawshi  
    OP
       Nov 6, 2016
    @mringg [group by] 只能取到第一条数据,但是那第一条数据不是最新的一条
    latyas
        19
    latyas  
       Nov 6, 2016
    对给定文章,评论表自增 id 最大和“最新”是否是一个意思? (前提是有自增 id 而不是 uuid 。。)
    fantasleotao
        20
    fantasleotao  
       Nov 6, 2016
    partition by
    des
        21
    des  
       Nov 6, 2016
    @shawshi
    这样如何
    SELECT * FROM users LEFT JOIN (SELECT uid,post,max(time) AS time FROM post GROUP BY uid) USING(uid);
    mliilm
        22
    mliilm  
       Nov 6, 2016
    需要用 window function ,比如 row number, first value 之类的
    msg7086
        23
    msg7086  
       Nov 6, 2016
    @des 关于一次搞定还分两次查的问题,建议跑一下看看性能如何,特别是修改数据导致 QueryCache 失效以后的性能。
    liujin834
        24
    liujin834  
       Nov 6, 2016
    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  
       Nov 7, 2016
    这种用窗口函数都是最简单的问题,所以换用 postgresql 吧, mysql 的查询太弱了!
    liujin834
        26
    liujin834  
       Nov 7, 2016
    @reus 同意, mysql 感觉就像是积木玩具一样。。。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1594 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 48ms · UTC 16:18 · PVG 00:18 · LAX 09:18 · JFK 12:18
    ♥ Do have faith in what you're doing.