Eliminar filas con MySQL LEFT JOIN

186

Tengo dos tablas, una para los plazos de trabajo, una para describir un trabajo. Cada trabajo puede tomar un estado y algunos estados significan que los plazos de los trabajos deben eliminarse de la otra tabla.

Puedo fácilmente SELECTlos trabajos / plazos que cumplen mis criterios con 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'

( statuspertenece a la jobtabla no deadline)

Pero cuando me gustaría eliminar estas filas deadline, MySQL arroja un error. Mi consulta es:

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'

El error de MySQL no dice nada:

Tiene un error en su sintaxis SQL; consulte el manual que corresponde a la versión de su servidor MySQL para obtener la sintaxis correcta para usar cerca de 'LEFT JOIN jobON deadline.job_id = job.job_id WHERE status=' szaml 'en la línea 1

¿Cómo puedo convertir mi SELECTen una DELETEconsulta de trabajo ?

fabrik
fuente

Respuestas:

335

Simplemente necesita especificar en qué tablas aplicar el DELETE.

Eliminar solo las deadlinefilas:

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

Eliminar las filas deadliney job:

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

Eliminar solo las jobfilas:

DELETE `job` FROM `deadline` LEFT JOIN `job` ....
Daniel Vassallo
fuente
44
Con "AS" tuve que usar el alias en mi cláusula para que funcione para mi propósito (eliminar huérfanos): ELIMINAR t1 DE la tabla1 AS t1 IZQUIERDA UNIRSE t2 AS t2 EN t1.uid = t2.result DONDE t2.result ES NULO
Urs
Curiosamente, mi verificador de sintaxis PHPMyAdmin 4.5.1 no aceptaba nada entre DELETEy FROM, pero la consulta funcionó bien de todos modos cuando presioné Ir.
clayRay
38

Si está utilizando "tabla como", especifíquelo para eliminarlo.

En el ejemplo, elimino todas las filas de la tabla_1 que no existen en la tabla_2.

DELETE t1 FROM `table_1` t1 LEFT JOIN `table_2` t2 ON t1.`id` = t2.`id` WHERE t2.`id` IS NULL
Roman Losev
fuente
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');

No estoy seguro de si ese tipo de subconsulta funciona en MySQL, pero pruébelo. Supongo que tiene una columna de ID en su tabla de fechas límite.

Francisco Soto
fuente
1
OP todavía necesita especificar qué hacer DELETEpara que la consulta no sea ambigua. Usar Incon subconsultas hace que todo sea mucho más lento. Es mejor evitarlo.
Ian Atkin
No se menciona ninguna tabla entre DELETEy FROM.
Istiaque Ahmed
1

Prueba esto:

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

MySQL le permite utilizar la cláusula INNER JOIN en la instrucción DELETE para eliminar filas de una tabla y las filas coincidentes en otra tabla.

Por ejemplo, para eliminar filas de las tablas T1 y T2 que cumplan una condición específica, utilice la siguiente instrucción:

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

Observe que coloca los nombres de tabla T1 y T2 entre las palabras clave DELETE y FROM. Si omite la tabla T1, la instrucción DELETE solo elimina filas en la tabla T2. Del mismo modo, si omite la tabla T2, la instrucción DELETE eliminará solo las filas de la tabla T1.

Espero que esto ayude.

Tahir
fuente