Нужна помощь в форматировании правильного запроса SQL на основе определенных критериев - PullRequest
0 голосов
/ 09 июля 2019

Вот моя текущая таблица sandbox:

| id | parent_id | title | text |
|----|-----------|-------|------|
| 1  | 11        | some  | text |
| 2  | 11        | some  | text |
| 3  | 11        | some  | text |
| 4  | 11        | some  | text |
| 5  | 11        | some  | text |
| 6  | 14        | some  | text |
| 7  | 14        | some  | text |
| 8  | 19        | some  | text |
| 9  | 19        | some  | text |

Чего я хочу добиться - это оставить N самых последних строк на основе определенного parent_id, оставив при этом другие строки с различными parent_ids без изменений.

Например, таблица с 3 самыми последними parent_id = 11 должна выглядеть следующим образом:

| id | parent_id | title | text |
|----|-----------|-------|------|
| 3  | 11        | some  | text |
| 4  | 11        | some  | text |
| 5  | 11        | some  | text |
| 6  | 14        | some  | text |
| 7  | 14        | some  | text |
| 8  | 19        | some  | text |
| 9  | 19        | some  | text |

Я уже пробовал:

DELETE FROM `sandbox`
WHERE id <= (
  SELECT id
  FROM (
    SELECT id
    FROM `sandbox`
    WHERE parent_id = 11
    ORDER BY id DESC
    LIMIT 1 OFFSET 3 <-- keep this many records
  ) foo
)

Но затем я теряю другие строки,получить таблицу следующим образом:

| id | parent_id | title | text |
|----|-----------|-------|------|
| 3  | 11        | some  | text |
| 4  | 11        | some  | text |
| 5  | 11        | some  | text |

Любая помощь по правильному запросу SQL будет принята:)

1 Ответ

0 голосов
/ 09 июля 2019

Включите parent_id = 11 в предложение WHERE и используйте NOT IN, чтобы избежать удаления 3 более свежих строк:

DELETE FROM `sandbox`
WHERE parent_id = 11
AND id NOT IN (
  SELECT id
  FROM (
    SELECT id
    FROM `sandbox`
    WHERE parent_id = 11
    ORDER BY id DESC
    LIMIT 3
  ) foo
)
...