2017-02-01 4 views
1

Скажем, у меня есть таблица со столбцами:Удалить все строки для старейшей 20, за исключением одного пользователя

id, username, createdat(timestamp). 

Как удалить все строки для одного пользователя, за исключением самого старого 20?

Так что в основном строки для других пользователей должны быть нетронутыми.

Я знаю, что код ниже неправильный, но все же хотел поделиться тем, что у меня есть. Любой вход или предложение приветствуются.

SELECT 
    * 
FROM 
    tableA 
WHERE 
    NOT EXISTS(SELECT 
      * 
     FROM 
      tableA 
     WHERE 
      username = 'abcdefg' 
     ORDER BY id ASC 
     LIMIT 20) 
+0

спасибо! Я ценю редактирование! – shle2821

+0

postgresql. Вы подразумеваете, что запросы будут разными, если я буду использовать mysql? – shle2821

+0

спасибо! Не знаю, что – shle2821

ответ

1

Вы близко.

DELETE FROM 
    tableA 
WHERE 
    id NOT IN(
    SELECT 
     id 
    FROM 
     tableA 
    WHERE 
     username = 'abcdefg' 
    ORDER BY createdat ASC LIMIT 20) 
    AND 
    username = 'abcdefg' 
1

Вы можете попробовать делать DELETE с левой присоединиться к подзапрос, который идентифицирует 20 записей для данного применения, которые должны не быть удалены.

DELETE a 
FROM tableA a 
LEFT JOIN 
(
    SELECT id 
    FROM tableA 
    WHERE username = 'abcdefg' 
    ORDER BY id 
    LIMIT 20 
) b 
    ON a.id = b.id 
WHERE b.id IS NULL AND 
     a.username = 'abcdefg' 
1

delete Использование и left join.

DELETE FROM a USING tableA a 
     LEFT JOIN 
    (SELECT 
     id 
    FROM 
     tableA 
    WHERE 
     username = 'abcdefg' 
    ORDER BY id 
    LIMIT 20) b ON a.id = b.id 
WHERE 
    b.id IS NULL AND a.username = 'abcdefg'; 
1

Использование Common Таблицы Expression, как это: -

;WITH CTE 
AS 
(
    SELECT *,ROW_NUMBER() OVER(PARTITION BY username ORDER BY createdat DESC) UserLevelId 
    FROM [YourTable] 
) 
DELETE FROM CTE 
WHERE CTE.UserLevelId > 20 
AND CTE.username IN (........) 

Надеется, что это помогает.

+0

Ограничить доступ к любому пользователю, добавив: - WHERE имя пользователя IN (........) –

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