このコードはMySQL5.0では機能しません。コードを書き直して機能させる方法
DELETE FROM posts where id=(SELECT id FROM posts GROUP BY id  HAVING ( COUNT(id) > 1 ))
一意のIDを持たない列を削除したい。ほとんどの場合、そのIDは1つだけです(構文を試しましたが、うまくいきません)。
回答:
SELECT(サブ)クエリは結果セットを返します。したがって、句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によって提案された結合を使用します。
SELECT id FROM posts GROUP BY id HAVING ( COUNT(id) > 1 )
                    DELETE 
  p1
  FROM posts AS p1 
CROSS JOIN (
  SELECT ID FROM posts GROUP BY id HAVING COUNT(id) > 1
) AS p2
USING (id)
    CROSS JOIN明らかにデカルト結合を実行するので、これは不必要な作業を行うか、最適に実行されない可能性がありますか?誰か説明してもらえますか?
                    USING条項がない場合にのみ、デカルト積を実行します。USING製品が同じ値を持つペアに限定されているid列、それは実際には非常に限られています。
                    DELETE    p1   FROM posts AS p1 INNER JOIN (   SELECT ID FROM posts GROUP BY id HAVING COUNT(id) > 1 ) AS p2 ON p2.ID=p1.ID