2010-07-14 62 views
22

Bảng SchemaMySQL Update Query sử dụng một trái tham gia

Bảng Tên: file_manager_folder

Hàng: id, parentId, name

truy vấn của tôi mô phỏng di chuyển một thư mục vào thư mục khác và chấp nhận một mảng sử dụng IN (?).

Tôi muốn bản cập nhật của mình chỉ 'di chuyển' một thư mục nếu chưa có thư mục có cùng tên cha mẹ và tên. Loại hành vi bạn mong đợi dưới bất kỳ hệ thống tệp thông thường nào.

Vì vậy, ví dụ:

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

Sẽ là một truy vấn mà không kiểm tra bất cứ điều gì về ParentID và tên ... Nhưng làm thế nào tôi có thể nhận trái tham gia để làm việc.

Đây là một trong những tôi đã cố gắng .. mà hoàn toàn không hoạt động.

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

Trả lời

46

Vì vậy, bạn muốn di chuyển các thư mục chỉ khi một thư mục cùng tên trong thư mục đích cha mẹ không không tồn tại:

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

Điều kiện tham gia tìm kiếm thư mục có cùng tên bên dưới đối tượng mục tiêu. Mệnh đề WHERE kiểm tra rằng không có thư mục nào tồn tại (f2.name là null chỉ khi kết nối bên ngoài không tìm thấy kết quả phù hợp).

+0

Thats Bill hoàn hảo. Tôi có thể thấy tôi đã có những điều cơ bản tại chỗ .. chỉ cần vô cùng ra khỏi nhãn hiệu! Tôi không biết làm thế nào bạn đóng đinh nó một cách nhanh chóng. Tôi không thể tìm ra những gì tôi muốn tham gia. – Layke

2

Loại ngây thơ nhưng làm thế nào về điều này?

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

Tôi nghĩ rằng điều này sẽ được giải quyết bằng cách sử dụng unique constraint/index trên các cột parentidname. Nếu không, bất kỳ ai có quyền truy cập INSERT/UPDATE vào bảng đều có thể phá vỡ quy tắc kinh doanh của bạn.

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

Nếu bạn sử dụng một NOT IN thay vì LEFT join rằng làm suy giảm hiệu suất của bạn.

Chạy Giải thích trước khi bạn truy vấn và vấn đề là hiển nhiên.

Các vấn đề liên quan