Сложный запрос. Помоги мне, пожалуйста!

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
    Включает ли ваш запрос все эти обратные пометки ( ` )?
  • 0
    да, мой запрос включает все эти галочки ...
Теги:

3 ответа

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 на один шаг с помощью подзапроса, но если вы просто хотите запустить этот один раз, я бы рекомендовал скриптировать его, зацикливать результаты, выполнение удалений и завершение.

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

Возможно, я что-то пропустил...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню