Excluir com junit no MySQL

CREATE TABLE `clients` ( `client_id` 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`) ); 

No meu código PHP, ao excluir um cliente, desejo excluir as postagens de todos os projetos:

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

A tabela de publicações não possui uma chave estrangeira client_id , somente project_id . Desejo excluir as postagens postadas em projetos que tenham o client_id passado.

Isso não está funcionando agora (nenhuma postagem é excluída).

Você só precisa especificar que deseja excluir as inputs da tabela de posts :

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

EDIT: Para mais informações você pode ver esta resposta alternativa

Como você está selecionando várias tabelas, a tabela a ser excluída não é mais inequívoca. Você precisa selecionar :

 delete posts from posts inner join projects on projects.project_id = posts.project_id where projects.client_id = :client_id 

Nesse caso, table_name1 e table_name2 são a mesma tabela, portanto, isso funcionará:

 delete projects from posts inner join [...] 

Você pode até deletar as duas tabelas se quiser:

 delete posts, projects from posts inner join [...] 

Observe que order by e limit não funcionam para exclusões de várias tabelas .

Além disso, esteja ciente de que, se você declarar um alias para uma tabela, deverá usar o alias ao fazer referência à tabela:

 delete p from posts as p inner join [...] 

Contribuições do Carpetsmoker e etc.

Ou a mesma coisa, com uma syntax ligeiramente diferente (mais intuitiva do IMO):

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

BTW, com o mysql usando joins é quase sempre mais rápido que subconsultas …

Você também pode usar o ALIAS como este funciona apenas no meu database! t é a tabela precisa excluir de!

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

Estou mais acostumado com a solução de subconsulta para isso, mas eu não tentei no MySQL:

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

MySQL DELETE registros com JOIN

Você geralmente usa INNER JOIN na instrução SELECT para selecionar registros de uma tabela que possui registros correspondentes em outras tabelas. Também podemos usar a cláusula INNER JOIN com a instrução DELETE para excluir registros de uma tabela e também os registros correspondentes em outras tabelas, por exemplo, para excluir registros de tabelas T1 e T2 que atendam a uma condição específica, use a seguinte instrução:

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

Observe que você coloca nomes de tabelas T1 e T2 entre DELETE e FROM. Se você omitir a tabela T1, a instrução DELETE exclui apenas registros na tabela T2 e, se você omitir a tabela T2, somente os registros na tabela T1 serão excluídos.

A condição de junit T1.key = T2.key especifica os registros correspondentes na tabela T2 que precisam ser excluídos.

A condição na cláusula WHERE especifica quais registros no T1 e T2 precisam ser excluídos.

Tente como abaixo:

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

Exclusão de Tabela Única:

Para excluir inputs da tabela de 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; 

Para excluir inputs da tabela de 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; 

Para excluir inputs da tabela de 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; 

Exclusão de várias tabelas:

Para excluir inputs de várias tabelas dos resultados unidos, você precisa especificar os nomes das tabelas após DELETE como uma lista separada por vírgulas:

Suponha que você queira excluir inputs de todas as três tabelas ( posts , projects , clients ) de um cliente específico:

 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 

Outro método de excluir usando uma sub seleção que é melhor do que usar IN seria WHERE EXISTS

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

Um motivo para usar isso em vez da junit é que um DELETE com JOIN proíbe o uso de LIMIT . Se você deseja excluir em blocos para não produzir bloqueios de tabela completos, você pode adicionar LIMIT usando este método 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); 

DELETE registros de uma tabela:

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

DELETE RECORDS DE ambas as tabelas:

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

Se a junit não funcionar para você, você pode tentar esta solução. É para excluir registros órfãos de t1 quando não estiver usando foreign keys + condições específicas de onde. Ou seja, apaga registros da tabela 1, que possuem campo vazio “código” e que não possuem registros na tabela 2, correspondentes pelo campo “nome”.

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

Tente isso

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

– Observe que você não pode usar um alias sobre a tabela onde você precisa excluir

 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