2010-09-22 55 views
0

我有一個表類型:複雜查詢。請幫幫我!

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

您的查詢是否實際包含所有反引號('\'')? – 2010-09-22 15:38:37

+0

是的,我的查詢包括所有反引號... – Zoitc2014 2010-09-23 08:20:18

回答

1

我覺得他misphrased的問題,根據他的代碼片段,因爲他要尋找其中的文字+電話的組合都行相同(因此CONCAT)。他不是簡單地尋找text = tel的行。

如果您願意爲此編寫一個快速腳本,而不是將其保存在純SQL中,則可以分兩步解決。

首先,找到其中的文字+電話是重複的行:

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文本= $ 2及電話= $ 3 AND時間< $ 4;

您也可以使用dupe_count結果做一個「從時間ASC限制x」刪除從tbl WHERE ... ORDER,其中x是dupe_count-1(從每個dupe組有效刪除一行)。

再花幾分鐘的時間,你可能會把後面的DELETE邏輯移植到一個子查詢的單個步驟中 - 但如果你只是想運行一次,我建議編寫腳本,循環結果,運行刪除,並完成。

0
SELECT text, tel, max(time) 
FROM ads 
WHERE text = tel 
group by text, tel 
having count(time) > 1 

我可能會丟失的東西在這裏...

0
SELECT text, tel, MAX(time) 
FROM ads 
WHERE text=tel 
GROUP BY text, tel