У меня есть тип таблицы:
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
что-то работает, но что-то не так: (но все же я не могу угадать, как удалить, оставив только одну запись повторения... у кого-нибудь есть идеи, напишите!
Я думаю, что он неправильно сформулировал этот вопрос, поскольку, согласно его фрагменту кода, он ищет строки, где комбинация текста + tel одинакова (отсюда и CONCAT). Он не просто ищет строки, где text = tel.
Если вы хотите написать быстрый script для этого и не хранить его в чистом SQL, вы можете решить его в два этапа.
Сначала найдите строки, где дублируется текст + 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)
Затем проведите через них и используйте:
УДАЛИТЬ ИЗ 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 на один шаг с помощью подзапроса, но если вы просто хотите запустить этот один раз, я бы рекомендовал скриптировать его, зацикливать результаты, выполнение удалений и завершение.
SELECT text, tel, MAX(time)
FROM ads
WHERE text=tel
GROUP BY text, tel
SELECT text, tel, max(time)
FROM ads
WHERE text = tel
group by text, tel
having count(time) > 1
Возможно, я что-то пропустил...
`
)?