复杂的查询。请帮帮我!

时间:2010-09-22 15:24:29

标签: mysql

我有一个表类型:

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

某些东西可以运作,但是一切都错了:(但我仍然无法猜测如何删除,只留下一条重复的记录......任何人都有任何想法,请写下来!

3 个答案:

答案 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