update registro mostrar modificar listar insertar ingresar guardar formulario eliminar ejemplo editar datos curso consultar con capitulo buscar actualizar mysql left-join

registro - Consulta de actualización de MySQL usando una combinación izquierda



php y mysql mostrar ingresar eliminar editar datos (4)

Esquema de tabla

Nombre de la tabla: file_manager_folder

Filas: id , parentId , name

Mi consulta simula mover una carpeta a otra carpeta y acepta una matriz usando IN (?).

Quiero que mi actualización solo "mueva" una carpeta si aún no hay una carpeta con el mismo ID de familia y nombre. El tipo de comportamiento que se esperaría en cualquier sistema de archivos normal.

Así por ejemplo:

UPDATE file_manager_folder set parentId = 54 where id IN( ''1'',''2'',3'')

Sería una consulta que no comprueba nada sobre el ID de padre y el nombre ... Pero, ¿cómo puedo hacer que la unión izquierda funcione?

Aquí hay uno que probé ... que no funciona del todo.

SELECT * FROM file_manager_folders as a LEFT JOIN file_manager_folders as b on a.id = b.id WHERE b.id IS NOT NULL and a.id IN("1","2","3") and a.parentId = 54

UPDATE table1 LEFT JOIN table2 SET t1.x = t2.y ON condition WHERE conditions


Creo que esto debería resolverse utilizando una restricción / índice único en las columnas de name y parentid . De lo contrario, cualquier persona con acceso a la tabla de INSERTAR / ACTUALIZAR puede burlar su regla de negocios.

CREATE UNIQUE INDEX blah_uk ON FILE_MANAGER_FOLDER(parentId, name) USING BTREE


Por lo tanto, desea mover carpetas solo si no existe una carpeta con el mismo nombre debajo de la carpeta principal de destino:

UPDATE file_manager_folder f1 LEFT OUTER JOIN file_manager_folder f2 ON f1.name = f2.name AND f2.parentId = 54 SET f1.parentId = 54 WHERE f2.name IS NULL AND f1.id IN (1,2,3);

La condición de unión busca una carpeta con el mismo nombre debajo del elemento primario de destino. La cláusula WHERE prueba que no existe tal carpeta (f2.name es nulo solo si la combinación externa no encuentra coincidencia).


Si usa una entrada NOT IN lugar de LEFT join degradará su rendimiento.

Ejecute Explicar antes de consultar y el problema es obvio.


Un poco ingenuo pero ¿qué tal esto?

UPDATE file_manager_folder SET parentId = 54 WHERE id IN( ''1'',''2'',''3'') AND parentId != 54 AND name NOT IN (SELECT name FROM file_manager_folder WHERE id IN (''1'', ''2'', ''3''))