DELETE FROM member_logins
WHERE id in(
SELECT ID
FROM (SELECT
ID,member_id,
IF( @prev <> member_id, @rownum := 1, @rownum := @rownum+1 ) AS rank,
@prev := member_id,date_created
FROM member_logins t
JOIN (SELECT @rownum := NULL, @prev := 0) AS r
ORDER BY t.member_id,t.date_created desc) as tmp
where tmp.rank > 2)
Исправлен запрос. Проверено на примере данных, и это работает для меня.
Образец данных, загруженных для тестирования
id member_id date_created
1 1 2/26/2011 12:00:00 AM
2 1 5/26/2011 12:00:00 AM
3 1 4/26/2011 12:00:00 AM
4 2 5/26/2011 12:00:00 AM
5 2 3/26/2011 12:00:00 AM
6 2 4/26/2011 12:00:00 AM
Вместо 50 у меня в запросе есть две верхние строки для тестирования.
Таким образом, мой запрос должен удалить все строки, имеющие ранг> 2 в каждой группе member_id, где в строках упорядочено по date_created desc.
Вывод после выполнения запроса на удаление:
id member_id date_created
2 1 5/26/2011 12:00:00 AM
3 1 4/26/2011 12:00:00 AM
4 2 5/26/2011 12:00:00 AM
6 2 4/26/2011 12:00:00 AM
Вы можете видеть строки с ID 1 и 5, которые были удалены. Это строки с рангом> 2 в каждой группе member_id