このコードはMySQL 5.0では機能しません。それを機能させるために書き直す方法
DELETE FROM posts where id=(SELECT id FROM posts GROUP BY id HAVING ( COUNT(id) > 1 ))
一意のIDを持たない列を削除したい。ほとんどの場合、そのIDを1つだけ追加します(構文を試しましたが、同様に機能しません)。
SELECT
(サブ)クエリは、結果setsを返します。したがって、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の提案どおり 。
DELETE
p1
FROM posts AS p1
CROSS JOIN (
SELECT ID FROM posts GROUP BY id HAVING COUNT(id) > 1
) AS p2
USING (id)
内部結合を使用できます:
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
すべての重複を削除したいが、重複の各セットのうち1つを削除する場合、これは1つの解決策です。
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;