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''))