このコードは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