[sql] MySQL의 선택에서 삭제하는 방법은 무엇입니까?

이 코드는 MySQL 5.0에서 작동하지 않습니다. 작동하도록 다시 작성하는 방법

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

고유 ID가없는 열을 삭제하고 싶습니다. 나는 대부분의 경우 유일한 ID를 추가 할 것입니다 (구문에서 시도했지만 잘 작동하지 않습니다).



답변

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이 제안한 조인 사용 하십시오 .


답변

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


답변

모든 중복 항목을 삭제하고 싶지만 각 중복 항목 중 하나를 삭제하려면 다음과 같은 해결책이 있습니다.

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;


답변