MySQLでselectから削除するにはどうすればよいですか?


86

このコードはMySQL5.0では機能しません。コードを書き直して機能させる方法

DELETE FROM posts where id=(SELECT id FROM posts GROUP BY id  HAVING ( COUNT(id) > 1 ))

一意のIDを持たない列を削除したい。ほとんどの場合、そのIDは1つだけです(構文を試しましたが、うまくいきません)。

回答:


212

SELECT(サブ)クエリは結果セットを返します。したがって、句INではなく=、を使用する必要がありますWHERE

さらに、この回答に示されているように、同じクエリ内のサブクエリから同じテーブルを変更することはできません。ただし、別のクエリでネストするかSELECTDELETE別のサブクエリをネストして内部サブクエリの結果にエイリアスを付けることができます(ただし、かなりハッキーに見えます)。

DELETE FROM posts WHERE id IN (
    SELECT * FROM (
        SELECT id FROM posts GROUP BY id HAVING ( COUNT(id) > 1 )
    ) AS p
)

または、Mchlによって提案された結合使用します


1
150個の重複キーがあるテーブルがありました。上記のクエリを実行すると、「144行が影響を受けました」と表示されましたが、キーが重複しています。そのため、クエリを再度実行すると、5行が影響を受け、1行が影響を受けたと表示されます。次に、すべての重複キーがなくなった。どうしてこれなの?
アレックス

あなたが唯一の重複の各セットのうちの1つのエントリを削除しているので、これは、起こっている:SELECT id FROM posts GROUP BY id HAVING ( COUNT(id) > 1 )
havvg

#1248-すべての派生テーブルには独自のエイリアスが必要です
2015年

@thang:それが私が内側のサブクエリをエイリアスするように言った理由です。
–BoltClock

1
「Asp」の機能を教えてください。
クリケット選手2015

22
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明らかにデカルト結合を実行するので、これは不必要な作業を行うか、最適に実行されない可能性がありますか?誰か説明してもらえますか?
wintron 2014年

USING条項がない場合にのみ、デカルト積を実行します。USING製品が同じ値を持つペアに限定されているid列、それは実際には非常に限られています。
Mchl 2014年

内部結合でも同じことができますか?IEDELETE 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
Kodos Johnson 2016

1
@アンドリュー:はい。機能的には、これらの結合はまったく同じです。
Mchl 2016

5

内部結合を使用できます:

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  

0

すべての重複を削除したいが、重複の各セットから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;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.