Это сложный вопрос, и я думаю, что трудно дать 100% надежный ответ без фактической таблицы и данных, с которыми можно поиграть.
Однако позвольте мне попытаться описать логику и составить запрос.шаг за шагом, так что вы можете поиграть с ним и, возможно, исправить скрытые ошибки.
1) Мы начнем с выбора всех IP-адресов, которые отправили более 60 голосов в определенный день.Для этого мы используем group by
в день голосования и на IP-адресе в сочетании с having
предложением
select date(voted), ip_adress
from table
group by date(voted), ip_adress
having count(*) > 60
2) С этого момента мы возвращаемся к таблице и выбираем первые 60идентификаторы, соответствующие каждому дню голосования / паре IP-адресов.id
является автоинкрементным полем, поэтому мы просто сортируем, используя это поле и используя инструкцию mysql limit
select id, ip_adress, date(voted) as day_voted
from table
where ip_adress, date(voted) in (
select date(voted), ip_adress
from table
group by date(voted), ip_adress
having count(*) > 60
)
order by id
limit 60
3) Наконец, мы снова возвращаемся к таблице и ищем все идентификаторычей ip адрес и день голосования принадлежат приведенному выше списку, но чей идентификатор больше максимального идентификатора списка.Это достигается с помощью join
и требует условия group by
.
select t1.id
from
table t1
join (
select id, ip_adress, date(voted) as day_voted
from table
where ip_adress, date(voted) in (
select date(voted), ip_adress
from table
group by date(voted), ip_adress
having count(*) > 60
)
order by id
limit 60
) t2
on t1.ip_adress = t2.ip_adress
and date(t1.voted) = t2.day_voted and t1.id > max(t2.id)
group by t1.id
Это должно вернуть список всех идентификаторов, которые нам нужно удалить.Проверьте, прежде чем идти дальше.
4) Самый последний шаг - удалить эти идентификаторы.В mysql есть ограничения, из-за которых delete
с условием подзапроса сделать довольно непросто.См. следующий вопрос SO для получения дополнительной информации о технической подготовке.Вы можете использовать временную таблицу для хранения выбранных идентификаторов или попытаться перехитрить mysql, заключив в подзапрос и присвоив ему псевдонимы.Давайте попробуем второй вариант:
delete t.* from table t where id in ( select id from (
select t1.id
from
table t1
join (
select id, ip_adress, date(voted) as day_voted
from table
where ip_adress, date(voted) in (
select date(voted), ip_adress
from table
group by date(voted), ip_adress
having count(*) > 60
)
order by id
limit 60
) t2
on t1.ip_adress = t2.ip_adress
and date(t1.voted) = t2.day_voted
and t1.id > max(t2.id)
group by t1.id
) x );
Надеюсь, это поможет!