2010-07-14 12 views
22

tabla de esquemaMySQL Consulta de actualización utilizando una combinación izquierda

Nombre 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 todavía no hay una carpeta con el mismo parentId y nombre. El tipo de comportamiento que 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 parentId y el nombre ... Pero, ¿cómo puedo obtener la izquierda se unen para trabajar.

Aquí hay una que probé ... lo cual no funciona en absoluto.

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

Respuesta

46

Así que quieres mover carpetas sólo si una carpeta del mismo nombre en la carpeta padre objeto hace no existen:

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 padre objetivo. La cláusula WHERE prueba que no existe tal carpeta (f2.name es nulo solo si la unión externa no encuentra coincidencia).

+0

Eso es perfecto Bill. Puedo ver que tenía lo básico en su lugar ... ¡increíblemente fuera de lugar! No sé cómo lo clavaste tan rápido. No pude entender en qué quería unirme. – Layke

2

Tipo de 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')) 
2

creo que esto debería ser resuelto mediante un unique constraint/index en los parentid y name columnas. De lo contrario, cualquier persona con acceso INSERT/UPDATE a la tabla puede eludir su regla de negocio.

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

Si utiliza un NOT IN en lugar de LEFT join que degrada su rendimiento.

Ejecutar Explicar antes de realizar la consulta y el problema es obvio.

Cuestiones relacionadas