Как удалить из select в MySQL?
Этот код не работает для MySQL 5.0, как перезаписать его, чтобы заставить его работать
DELETE FROM posts where id=(SELECT id FROM posts GROUP BY id HAVING ( COUNT(id) > 1 ))
Я хочу удалить столбцы, которые не имеют уникального идентификатора. Я добавлю, что большую часть времени его единственный один id (я пробовал синтаксис, и он тоже не работает).
Ответы
Ответ 1
SELECT
(sub) запросы возвращают наборы результатов. Поэтому вам нужно использовать IN
, а не =
в предложении WHERE
.
Кроме того, как показано в этом ответе, вы не можете изменить одну и ту же таблицу из подзапроса в том же запросе. Тем не менее, вы можете либо SELECT
, либо DELETE
в отдельных запросах, либо вложить другой подзапрос и псевдоним результата внутреннего подзапроса (выглядит довольно взломанным):
DELETE FROM posts WHERE id IN (
SELECT * FROM (
SELECT id FROM posts GROUP BY id HAVING ( COUNT(id) > 1 )
) AS p
)
Или используйте объединения как предложено Mchl.
Ответ 2
DELETE
p1
FROM posts AS p1
CROSS JOIN (
SELECT ID FROM posts GROUP BY id HAVING COUNT(id) > 1
) AS p2
USING (id)
Ответ 3
вы можете использовать внутреннее соединение:
DELETE
ps
FROM
posts ps INNER JOIN
(SELECT
distinct id
FROM
posts
GROUP BY id
HAVING COUNT(id) > 1 ) dubids on dubids.id = ps.id
Ответ 4
Если вы хотите удалить все дубликаты, но один из каждого набора дубликатов, это одно из решений:
DELETE posts
FROM posts
LEFT JOIN (
SELECT id
FROM posts
GROUP BY id
HAVING COUNT(id) = 1
UNION
SELECT id
FROM posts
GROUP BY id
HAVING COUNT(id) != 1
) AS duplicate USING (id)
WHERE duplicate.id IS NULL;