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


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

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