V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
KagamineLenKai2
V2EX  ›  问与答

请问 MySQL 怎样实现根据特定条件筛选重复值?

  •  1
     
  •   KagamineLenKai2 · 2016-11-03 13:41:29 +08:00 · 1788 次点击
    这是一个创建于 2946 天前的主题,其中的信息可能已经有所发展或是发生改变。

    分公司 | 实时状态 | applyid | 操作人| 合同复核时间 | 合同编号
    上面是我已经写好的查询,其中“合同编号”一列有重复值,我需要去重。
    去重规则为当“合同编号”有重复值,并且“合同复核时间”都为同一天时,保留“合同复核时间”最大的一行。
    当“合同编号”有重复值并且“合同复核时间”不为同一天时,保留每一天的最大值。比如说一个编号在 1 日出现了 2 次,在 2 日出现了 1 次,那么保留 1 日时间最大的一行和 2 日的那行。
    因为权限原因我不能用临时表,不能用子查询,只能用连接查询。请问该怎样按条件去重呢?多谢各位 /(ㄒoㄒ)/~~

    7 条回复    2016-11-03 15:16:50 +08:00
    zakokun
        1
    zakokun  
       2016-11-03 14:13:44 +08:00
    搜索出来用其他语言处理,处理好了再塞回去
    zachlhb
        2
    zachlhb  
       2016-11-03 14:30:21 +08:00 via Android
    为什么同一天复核时不用更新而是用新增?
    KagamineLenKai2
        3
    KagamineLenKai2  
    OP
       2016-11-03 14:37:35 +08:00
    @zachlhb 更新的话就记录不到是否重复复核吧…表不是我建的┑( ̄Д  ̄)┍
    Layne
        4
    Layne  
       2016-11-03 14:38:28 +08:00
    你的权限允许把查询结果作为子表再进行连接查询吗?

    先把你要查的这张表的数据按合同编号分组,合同复核时间取 MAX ,查询结果作为子表,合同编号和最大合同复合时间作为连接条件,再左连接这张表补充其他字段。

    当然合同编号和合同复核时间两个字段要能确定一条记录。
    KagamineLenKai2
        5
    KagamineLenKai2  
    OP
       2016-11-03 14:39:15 +08:00
    @zakokun 然而我不是程序员,只是一个破做表的 /(ㄒoㄒ)/~~ 头像是 Len 吗?
    KagamineLenKai2
        6
    KagamineLenKai2  
    OP
       2016-11-03 14:41:35 +08:00
    @Layne 好,我试一下……
    KagamineLenKai2
        7
    KagamineLenKai2  
    OP
       2016-11-03 15:16:50 +08:00
    在 CSDN 上受人指点惹,这里把 SQL 贴出来,希望能帮到一些人

    作者:鏡音連改二
    链接: https://www.zhihu.com/question/52243984/answer/129648873
    来源:知乎
    著作权归作者所有,转载请联系作者获得授权。

    SELECT
    apply.org_name AS 分公司,
    n.statusdes AS 实时状态,
    operation_log.apply_id,
    operation_log.operator_name AS 合同复核操作人,
    max(
    operation_log.operation_time
    ) AS 合同复核时间,
    contract.contract_number AS 合同编号,
    contract.actual_loan_time AS 实际放款时间,
    contract.loan_amount AS 合同金额
    FROM
    operation_log
    LEFT JOIN contract ON contract.apply_id = operation_log.apply_id
    LEFT JOIN apply ON apply.apply_id = operation_log.apply_id
    LEFT JOIN (
    SELECT
    group_concat(
    DISTINCT c.status_code SEPARATOR '||'
    ) AS statussum,
    c.is_in_node,
    c.apply_id,
    group_concat(
    DISTINCT c.status_name SEPARATOR '||'
    ) AS statusdes,
    group_concat(
    DISTINCT c.operator_name SEPARATOR '||'
    ) AS operatornames
    FROM
    node_record c
    WHERE
    c.is_in_node = 1
    AND c.is_valid = 1
    GROUP BY
    c.apply_id
    ) n ON apply.apply_id = n.apply_id
    WHERE
    operation_time >= "2016-11-1"
    AND before_status_name = "合同复核中"
    AND end_status_name = "合同复核完成"
    AND operation_log.node_code = "REVIEW"
    AND apply.is_ex_apply = '1'
    AND apply.borrowing_type = '1'
    AND operation_log.operator_name NOT LIKE "%测试%"
    GROUP BY
    apply.org_name,
    n.statusdes,
    operation_log.apply_id,
    operation_log.operator_name,
    DATE(
    operation_log.operation_time
    ),
    contract.contract_number,
    contract.actual_loan_time,
    contract.loan_amount
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5557 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 40ms · UTC 06:01 · PVG 14:01 · LAX 22:01 · JFK 01:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.