我有一个表类型:
id | text | tel | time
----------------------------
1 | text1 | tel1 | unixtime
2 | text1 | tel1 | unixtime
3 | text1 | tel1 | unixtime
4 | text2 | tel2 | unixtime
5 | text3 | tel3 | unixtime
6 | text3 | tel3 | unixtime
我希望它“干净”,尝试删除text
= tel
的所有行,并留下最大time
的行。我是这样开始的:
SELECT concat(`text`, `tel`),
count(concat(`text`, `tel`))
FROM `ads` GROUP by concat(`text`, `tel`)
Having count(concat(`text`, `tel`)) > 1
某些东西可以运作,但是一切都错了:(但我仍然无法猜测如何删除,只留下一条重复的记录......任何人都有任何想法,请写下来!
答案 0 :(得分:1)
我认为他误解了这个问题,因为根据他的代码片段,他正在寻找文本+ tel的组合相同的行(因此是CONCAT)。他不只是寻找text = tel。
的行如果您愿意为此编写快速脚本而不是将其保存在纯SQL中,则可以分两步解决。
首先,找到text + tel重复的行:
mysql>
SELECT count(id) as dupe_count,
text as dupe_text,
tel as dupe_tel,
max(time) as dupe_maxtime
FROM tbl
GROUP BY concat(text,tel)
HAVING dupe_count > 1;
+------------+-----------+----------+--------------+
| dupe_count | dupe_text | dupe_tel | dupe_maxtime |
+------------+-----------+----------+--------------+
| 4 | text1 | tel1 | 1285203547 |
+------------+-----------+----------+--------------+
1 row in set (0.00 sec)
然后遍历它们,并使用:
DELETE FROM tbl WHERE text = $ 2 AND tel = $ 3 AND time< $ 4 强>
您还可以使用dupe_count结果执行“DELETE FROM tbl WHERE ... ORDER BY time ASC LIMIT x”,其中x是dupe_count-1(实际上删除了每个欺骗组中除了一行之外的所有行)。
通过几分钟的工作,您可以将后一个DELETE逻辑移植到带有子查询的单个步骤中 - 但如果您只想运行一次,我建议编写脚本,循环结果,运行删除并完成。
答案 1 :(得分:0)
SELECT text, tel, max(time)
FROM ads
WHERE text = tel
group by text, tel
having count(time) > 1
我可能在这里遗漏了一些东西......
答案 2 :(得分:0)
SELECT text, tel, MAX(time)
FROM ads
WHERE text=tel
GROUP BY text, tel