Excluindo linhas com o MySQL LEFT JOIN

186

Eu tenho duas tabelas, uma para prazos de trabalho, uma para descrever um trabalho. Cada trabalho pode assumir um status e alguns status significam que os prazos dos trabalhos devem ser excluídos da outra tabela.

Posso facilmente SELECTos trabalhos / prazos que atendem aos meus critérios com LEFT JOIN:

SELECT * FROM `deadline`
LEFT JOIN `job` ON deadline.job_id = job.job_id
WHERE `status` = 'szamlazva'
OR `status` = 'szamlazhato'
OR `status` = 'fizetve'
OR `status` = 'szallitva'
OR `status` = 'storno'

( statuspertence à jobtabela não deadline)

Mas quando eu gostaria de excluir essas linhas deadline, o MySQL lança um erro. Minha consulta é:

DELETE FROM `deadline`
LEFT JOIN `job`
ON deadline.job_id = job.job_id
WHERE `status` = 'szamlazva'
OR `status` = 'szamlazhato'
OR `status` = 'fizetve'
OR `status` = 'szallitva'
OR `status` = 'storno'

Erro no MySQL não diz nada:

Você tem um erro na sua sintaxe SQL; verifique o manual que corresponde à versão do servidor MySQL para a sintaxe correta a ser usada perto de 'LEFT JOIN jobON deadline.job_id = job.job_id WHERE status=' szaml 'na linha 1

Como transformar minha consulta SELECTem trabalho DELETE?

fabrik
fonte

Respostas:

335

Você só precisa especificar em quais tabelas aplicar o DELETE.

Exclua apenas as deadlinelinhas:

DELETE `deadline` FROM `deadline` LEFT JOIN `job` ....

Exclua as linhas deadlinee job:

DELETE `deadline`, `job` FROM `deadline` LEFT JOIN `job` ....

Exclua apenas as joblinhas:

DELETE `job` FROM `deadline` LEFT JOIN `job` ....
Daniel Vassallo
fonte
4
Com "AS", tive que usar o alias da minha cláusula para fazê-lo funcionar para meu propósito (excluir órfãos): DELETE t1 DA tabela1 COMO t1 LEFT JOIN t2 COMO t2 ON t1.uid = t2.result WHERE t2.result IS WHERE
Urs
Curiosamente, meu verificador de sintaxe do PHPMyAdmin 4.5.1 não aceita nada entre DELETEe FROM, mas a consulta funcionou bem de qualquer maneira quando eu pressionei Go.
clayRay 24/03
38

Se você estiver usando "tabela como", especifique-o para excluir.

No exemplo, excluo todas as tabelas da tabela_1 que não existem na tabela_2.

DELETE t1 FROM `table_1` t1 LEFT JOIN `table_2` t2 ON t1.`id` = t2.`id` WHERE t2.`id` IS NULL
Roman Losev
fonte
4
DELETE FROM deadline where ID IN (
    SELECT d.ID FROM `deadline` d LEFT JOIN `job` ON deadline.job_id = job.job_id WHERE `status` =  'szamlazva' OR `status` = 'szamlazhato' OR `status` = 'fizetve' OR `status` = 'szallitva' OR `status` = 'storno');

Não tenho certeza se esse tipo de subconsulta funciona no MySQL, mas tente. Suponho que você tenha uma coluna de ID na sua tabela de prazos.

Francisco Soto
fonte
1
O OP ainda precisa especificar o DELETEque tornar a consulta inequívoca. Usar Incom subconsultas torna tudo muito mais lento. É melhor evitar.
11133 Ian Atkin
Nenhuma tabela mencionada entre DELETEe FROM.
Istiaque Ahmed
1

Tente o seguinte:

DELETE `deadline`
FROM `deadline`
INNER JOIN `job` ON `deadline`.`job_id` = `job`.`id`
WHERE `job`.`id` = 123
Zon
fonte
1

O MySQL permite que você use a cláusula INNER JOIN na instrução DELETE para excluir linhas de uma tabela e as linhas correspondentes em outra tabela.

Por exemplo, para excluir linhas das tabelas T1 e T2 que atendem a uma condição especificada, use a seguinte instrução:

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

Observe que você coloca os nomes das tabelas T1 e T2 entre as palavras-chave DELETE e FROM. Se você omitir a tabela T1, a instrução DELETE exclui apenas linhas na tabela T2. Da mesma forma, se você omitir a tabela T2, a instrução DELETE excluirá apenas as linhas da tabela T1.

Espero que esta ajuda.

Tahir
fonte