web-dev-qa-db-ja.com

MySQLのselectから削除する方法は?

このコードはMySQL 5.0では機能しません。それを機能させるために書き直す方法

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

一意のIDを持たない列を削除したい。ほとんどの場合、そのIDを1つだけ追加します(構文を試しましたが、同様に機能しません)。

74
IAdapter

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の提案どおり

182
BoltClock
DELETE 
  p1
  FROM posts AS p1 
CROSS JOIN (
  SELECT ID FROM posts GROUP BY id HAVING COUNT(id) > 1
) AS p2
USING (id)
20
Mchl

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

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  
3
Elegant Odoo

すべての重複を削除したいが、重複の各セットのうち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;
0
havvg