求表内“N 条留 1 条”的语句(以多字段来判断 N 条)

2019-10-02 15:20:16 +08:00
 pppguest3962

表内字段是这样的:
id|a|aid|b|bid|size|weight|updatetime

id 是自增长,a 是 string,aid 是 int,b 也一样,updatetime 是 datetime 类型

求两条 mysql 语句:
1、a,aid,b,bid 相同的条目,只保留 updatetime 最新的 1 条数据
2、a,aid,b,bid 相同的条目,只保留最后加入的单条数据,最后加入的数据,是不是只能以 id 最大值来判断?为什么有 1 的问题了,还要有最后加入的数据来判断了,因为 updatetime 字段内容缺失,现在也搞不懂为什么,只能用 id 最大来判断?

感谢各位,不急也不会这样伸手了,谢谢大家的热心解答!

4447 次点击
所在节点    MySQL
6 条回复
kaneg
2019-10-02 15:53:00 +08:00
手机码字不易,给个基本思路:通过 Group by a,aid,b,bid,max ( uodatetime )拿到 id,这个作为子查询的条件,然后组合 delete 就可以了
zappos
2019-10-02 17:44:15 +08:00
我猜数据会更新,id 小的数据如果之后更新,updatetime 会变大。
eote
2019-10-02 17:44:57 +08:00
```
SELECT T1.* FROM T T1
INNER JOIN (SELECT A, AID, B, BID, MAX(UPDATETIME) AS UPDATETIME FROM T GROUP BY A, AID, B, BID) T2
ON T1.A=T2.A AND T1.AID=T2.AID AND T1.B=T2.B AND T1.BID=T2.BID AND T1.UPDATETIME=T2.UPDATETIME
```
eote
2019-10-02 17:45:58 +08:00
取一个时间切片最新数据
srlp
2019-10-03 11:03:40 +08:00
select a,aid,b,bid from
(select a,aid,b,bid, row_number() over (partition by a,aid,b,bid order by updatetime desc) as therank) t
where t.therank=1

使用 id 排序的话替代上文 updatetime 即可。

原理是使用了窗口函数 windows function
srlp
2019-10-03 11:09:28 +08:00
但是旧版本可能不支持 window function,那就要用类似 1 楼的 inner join 了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/606012

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX