我需要帮助从表中删除不需要的行。
该表具有用户"签到"由于软件中的早期错误,有些日子有重复。
每天uid
每lid
只应该有一个条目(timestamp
)。
示例数据:
id | t |uid| lid| timestamp
______________________________________
339 | 0 | 1 | 54 | 2014-03-28 16:02:05 <-- KEEP
341 | 0 | 1 | 54 | 2014-03-28 17:14:27 <-- DISCARD
420 | 0 | 1 | 54 | 2014-04-02 14:47:55 <-- KEEP
421 | 0 | 1 | 54 | 2014-04-02 15:15:04 <-- DISCARD
423 | 0 | 1 | 54 | 2014-04-03 11:06:36 <-- KEEP
427 | 0 | 1 | 54 | 2014-04-03 12:15:47 <-- DISCARD
428 | 0 | 1 | 54 | 2014-04-03 14:24:20 <-- DISCARD
470 | 0 | 1 | 54 | 2014-04-04 12:43:36 <-- KEEP
487 | 0 | 1 | 54 | 2014-04-04 14:34:38 <-- DISCARD
488 | 0 | 1 | 54 | 2014-04-04 14:36:41 <-- DISCARD
非常感谢我可以在我的桌面上执行的MySQL DELETE
命令,以丢弃不需要的行(id
)。
此外,如果可能,这应该适用于多个uid
和lid
。如果没有,我可以很容易地在带有循环的脚本中运行。
提前致谢
答案 0 :(得分:2)
更新基于与OP的聊天:
试试这个:
DELETE a
FROM
check-ins a
left join
(
SELECT uid, lid, MIN(timestamp) AS min_time
FROM check-ins
GROUP BY uid, lid, DATE(timestamp)
) AS P
on
(a.uid = p.uid AND
a.lid = p.lid AND
a.timestamp = p.min_time)
where p.uid IS NULL
解释:
首先尝试select
语句。这将返回每个盖子每个盖子的所有最小日期时间戳。
SELECT uid, lid, MIN(timestamp) AS min_time
FROM check-ins
GROUP BY uid, lid, DATE(timestamp)
然后删除除这些记录之外的所有内容。