sql >> Database teknologi >  >> RDS >> PostgreSQL

Gem kun de sidste 5 søgeresultater for brugeren i en tabel

Korrekt syntaks som beskrevet i manualen :

DELETE FROM history_user h
USING (
    SELECT pk_id, row_number() OVER (ORDER BY search_time DESC) AS rn;
    FROM   history_user
    WHERE  user_id = 188
    ) sub
WHERE sub.rn > 5
AND   h.pk_id = sub.pk_id;

Hvor pk_id er enhver (kombination af) kolonne(r), der er unik . Måske user_id , search_time i dit tilfælde - eller mere bekvemt, en surrogat primærnøgle.

For kun en enkelt user_id du kan forenkle til:

DELETE FROM history_user h
USING (
    SELECT pk_id
    FROM   history_user
    WHERE  user_id = 188
    ORDER  BY search_time DESC
    OFFSET 5
    ) sub
WHERE h.pk_id = sub.pk_id;

På den anden side, at håndtere multiple brugere på én gang, skal du tilføje PARTITION BY til din vinduesfunktion:

DELETE FROM history_user h
USING (
    SELECT pk_id, row_number() OVER (PARTITION BY user_id
                                     ORDER BY search_time DESC) AS rn;
    FROM   history_user
    ) sub
WHERE sub.rn > 5
AND   h.pk_id = sub.pk_id;



  1. Fejl i MySQL-biblioteket for Node.js

  2. Er mysql_real_escape_string nok til Anti SQL Injection?

  3. prøver at opdatere mysql-databasen i php

  4. Sådan begrænser du den maksimale visningslængde af en kolonne i PostgreSQL