sourcecode

MySQL에서 Join을 사용하여 삭제

copyscript 2022. 9. 26. 21:54
반응형

MySQL에서 Join을 사용하여 삭제

테이블을 작성하는 스크립트는 다음과 같습니다.

CREATE TABLE clients (
   client_i INT(11),
   PRIMARY KEY (client_id)
);
CREATE TABLE projects (
   project_id INT(11) UNSIGNED,
   client_id INT(11) UNSIGNED,
   PRIMARY KEY (project_id)
);
CREATE TABLE posts (
   post_id INT(11) UNSIGNED,
   project_id INT(11) UNSIGNED,
   PRIMARY KEY (post_id)
);

내 PHP 코드에서 클라이언트를 삭제할 때 모든 프로젝트 투고를 삭제하고 싶다.

DELETE 
FROM posts
INNER JOIN projects ON projects.project_id = posts.project_id
WHERE projects.client_id = :client_id;

키가 .client_id,만.project_idclient_id.

게시글이 삭제되지 않아 현재 동작하지 않습니다.

.posts 삭제:

DELETE posts
FROM posts
INNER JOIN projects ON projects.project_id = posts.project_id
WHERE projects.client_id = :client_id

편집: 자세한 내용은 이 대체 답변을 참조하십시오.

여러 테이블을 선택하기 때문에 삭제할 테이블은 더 이상 명확하지 않습니다.다음을 선택해야 합니다.

DELETE posts FROM posts
INNER JOIN projects ON projects.project_id = posts.project_id
WHERE projects.client_id = :client_id

「」는,table_name1 ★★★★★★★★★★★★★★★★★」table_name2같은 테이블이므로 다음과 같이 동작합니다.

DELETE projects FROM posts INNER JOIN [...]

필요에 따라서, 양쪽의 테이블에서 삭제할 수도 있습니다.

DELETE posts, projects FROM posts INNER JOIN [...]

:order by ★★★★★★★★★★★★★★★★★」limit 다중 테이블 삭제에는 사용할 없습니다.

또한 테이블의 에일리어스를 선언할 경우 테이블을 참조할 때 에일리어스를 사용해야 합니다.

DELETE p FROM posts as p INNER JOIN [...]

카펫메이커 등의 기부금

또는 약간 다른(IMO 프렌들리) 구문을 사용하는 경우에도 마찬가지입니다.

DELETE FROM posts 
USING posts, projects 
WHERE projects.project_id = posts.project_id AND projects.client_id = :client_id;

참고로 mysql을 사용하면 서브쿼리보다 훨씬 빠릅니다.

ALIAS를 이렇게 사용할 수도 있습니다.그냥 내 데이터베이스에서 사용했을 뿐이에요!

DELETE t FROM posts t
INNER JOIN projects p ON t.project_id = p.project_id
AND t.client_id = p.client_id

서브쿼리 솔루션에 더 익숙하지만 MySQL에서는 시도해 본 적이 없습니다.

DELETE  FROM posts
WHERE   project_id IN (
            SELECT  project_id
            FROM    projects
            WHERE   client_id = :client_id
        );

단일 테이블 삭제:

에서 posts 삭제:

DELETE ps 
FROM clients C 
INNER JOIN projects pj ON C.client_id = pj.client_id
INNER JOIN posts ps ON pj.project_id = ps.project_id
WHERE C.client_id = :client_id;

에서 projects 삭제:

DELETE pj 
FROM clients C 
INNER JOIN projects pj ON C.client_id = pj.client_id
INNER JOIN posts ps ON pj.project_id = ps.project_id
WHERE C.client_id = :client_id;

에서 clients 삭제:

DELETE C
FROM clients C 
INNER JOIN projects pj ON C.client_id = pj.client_id
INNER JOIN posts ps ON pj.project_id = ps.project_id
WHERE C.client_id = :client_id;

다중 테이블 삭제:

중 하려면 테이블 이름을 .DELETE다음 중 하나:

테이블에서 엔트리를 합니다(「3」).posts ,projects ,clients 클라이언트의: " " " " :

DELETE C,pj,ps 
FROM clients C 
INNER JOIN projects pj ON C.client_id = pj.client_id
INNER JOIN posts ps ON pj.project_id = ps.project_id
WHERE C.client_id = :client_id

JOIN을 사용한 MySQL DELETE 레코드

일반적으로 SELECT 문에서는 INSER JOIN을 사용하여 다른 테이블에 대응하는 레코드가 있는 레코드를 테이블에서 선택합니다.또한 DELETE 문과 함께 INSER JOIN 구를 사용하여 테이블에서 레코드를 삭제하고 다른 테이블에서 대응하는 레코드를 삭제할 수도 있습니다.예를 들어 특정 조건을 충족하는 T1 테이블과 T2 테이블 모두에서 레코드를 삭제할 경우 다음 문을 사용합니다.

DELETE T1, T2
FROM T1
INNER JOIN T2 ON T1.key = T2.key
WHERE condition

테이블명 T1과 T2는 DELETE와 FROM 사이에 배치되어 있는 것에 주의해 주세요.T1 테이블을 생략하면 DELETE 문은 T2 테이블 내의 레코드만 삭제합니다.T2 테이블을 생략하면 T1 테이블 내의 레코드만 삭제됩니다.

조인 조건 T1.key = T2.key는 T2 테이블에서 삭제해야 하는 해당 레코드를 지정합니다.

WHERE 절의 조건은 T1 및 T2에서 삭제할 필요가 있는 레코드를 지정합니다.

다음과 같이 시도합니다.

DELETE posts.*,projects.* 
FROM posts
INNER JOIN projects ON projects.project_id = posts.project_id
WHERE projects.client_id = :client_id;

서브선택을 사용하여 삭제하는 다른 방법으로는 를 사용하는 것보다 낫다.IN되지요WHERE EXISTS

DELETE  FROM posts
WHERE   EXISTS ( SELECT  1 
                 FROM    projects
                 WHERE   projects.client_id = posts.client_id);

가입 대신 이것을 사용하는 한 가지 이유는DELETE와 함께JOIN사용을 금하다LIMIT완전한 테이블 잠금이 생성되지 않도록 블록에서 삭제하려는 경우 추가 가능LIMIT이것을 사용하다DELETE WHERE EXISTS방법.

mysql> INSERT INTO tb1 VALUES(1,1),(2,2),(3,3),(6,60),(7,70),(8,80);

mysql> INSERT INTO tb2 VALUES(1,1),(2,2),(3,3),(4,40),(5,50),(9,90);

한 테이블에서 레코드 삭제:

mysql> DELETE tb1 FROM tb1,tb2 WHERE tb1.id= tb2.id;

양쪽 테이블에서 레코드 삭제:

mysql> DELETE tb2,tb1 FROM tb2 JOIN tb1 USING(id);

가입이 여의치 않을 경우 이 솔루션을 사용해 보십시오.외부 키 + 특정 where 조건을 사용하지 않을 때 t1에서 분리 레코드를 삭제합니다.즉, "코드" 필드가 비어 있고 "이름" 필드가 일치하는 table2에 레코드가 없는 레코드를 table1에서 삭제합니다.

delete table1 from table1 t1 
    where  t1.code = '' 
    and 0=(select count(t2.name) from table2 t2 where t2.name=t1.name);

이거 드셔보세요.

DELETE posts.*
FROM posts
INNER JOIN projects ON projects.project_id = posts.project_id
WHERE projects.client_id = :client_id

한 가지 해결책은 서브쿼리를 사용하는 것입니다.

DELETE FROM posts WHERE post_id in (SELECT post_id FROM posts p
INNER JOIN projects prj ON p.project_id = prj.project_id 
INNER JOIN clients c on prj.client_id = c.client_id WHERE c.client_id = :client_id 
);

서브쿼리는 삭제할 필요가 있다ID를 반환합니다.3개의 테이블은 모두 join을 사용하여 연결되며 필터 조건을 충족하는 레코드만 삭제됩니다(이 경우 where 구의 client_id).

-- 삭제가 필요한 테이블에는 에일리어스를 사용할 수 없습니다.

DELETE tbl_pagos_activos_usuario
FROM tbl_pagos_activos_usuario, tbl_usuarios b, tbl_facturas c
Where tbl_pagos_activos_usuario.usuario=b.cedula
and tbl_pagos_activos_usuario.cod=c.cod
and tbl_pagos_activos_usuario.rif=c.identificador
and tbl_pagos_activos_usuario.usuario=c.pay_for
and tbl_pagos_activos_usuario.nconfppto=c.nconfppto
and NOT ISNULL(tbl_pagos_activos_usuario.nconfppto)
and c.estatus=50

언급URL : https://stackoverflow.com/questions/652770/delete-with-join-in-mysql

반응형