2013-11-15 2 views
0

У меня есть страница для каждой учетной записи, которая отображает последние 10 логинов с IP-адресом и датой. Мне нужно только последние 10 из них для каждой учетной записи, поэтому я бы хотел удалить 11, 12, 13 строку с тем же значением account_id. Моя структура таблицы:Удалить строки с индексом выше X с тем же значением

+----+------------+------------+------------+ 
| id | account_id | ipv4 | timestamp | 
+----+------------+------------+------------+ 
| 25 | 9977930 | 1299288404 | 1362261821 | 
| 26 | 9982862 | 1604359422 | 1362262365 | 
+----+------------+------------+------------+ 

Я пытался что-то вроде:

DELETE t1 FROM `lastlogin` t1 
LEFT JOIN 
(
    SELECT `account_id` 
    FROM `lastlogin` 
    LIMIT 10 OFFSET 10 
) t2 on t2.account_id = t1.account_id AND t2.value = t1.value 
WHERE t2.value is null; 

Но мой выбор утверждение неверно, а остальное тоже плохо. У меня нет хорошей идеи, как это сделать, кроме добавления нового столбца для индекса и опыта с более сложным SQL ... Может ли кто-нибудь построить этот запрос?

+0

Я немного озадачен столбцом «значение» в вашем запросе. Это не в описании вашей таблицы. – wvdz

+0

Я знаю - это всего лишь фрагмент кода, который я скопировал> вставить и попытался заставить его работать для меня. –

ответ

2

Я хотел бы использовать функцию номер строки, так:

 Delete t1 from 
     (select accountid, 
     row_number() over (partition by accountid, order by accountid,      
     Timestamp desc) as r 
     From lastlogin) t1 
    where t1.r > 10 

Надеюсь, этот синтаксис является правильным, по сути вы используете функцию номер строки, чтобы создать ряд, который увеличивает для каждого различного внутрибрюшинно в порядке убывания времени и сбросы для каждого другого аккаунта.

Предполагается, что вы хотите, чтобы последние ips и каждый ip были разными. Если ips не являются отдельным разделом по метке времени или идентификатору. Сначала запустите выбор!

+0

# 1064 - У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с ним (раздел по учетной записи, order by accountid, timesta) в строке 3 –

+0

Это потому, что он дает вам версию MSSQL. Вы хотите, чтобы версия mysql для удаления с использованием a rownum. http://www.explodybits.com/2011/11/mysql-row-number/ – maplemale

+0

Извините, да, может быть синтаксическая ошибка - я не пробовал, но знаю, что техника работает, поэтому мое предложение чтобы исследовать row_number и заставить его работать на вас. Cheers – user2915906

0

Сделайте это в запросе, который заполняется в первую очередь.

У вас есть метка времени.

SELECT TOP 10 

... 

ORDER BY timestamp DESC 

Это приведет к тому, что ваш список будет отображаться в порядке убывания. Вы можете перевернуть заказ несколькими способами.

+1

MySQL не поддерживает предложения TOP 10 для SELECT – RolandoMySQLDBA

+0

Вместо этого вы используете функцию LIMIT в конце запроса. – maplemale

Смежные вопросы