2012-02-01 29 views
5

Tôi có bảng cơ sở dữ liệu MySQL có chứa ID bài viết (khóa chính) và Tiêu đề bài viết. Tôi muốn xóa các tiêu đề trùng lặp khỏi bảng nhưng giữ nguyên lần xuất hiện đầu tiên. Tôi ban đầu chỉ đơn giản là đã làm một truy vấn cho tất cả các danh hiệu trùng lặp:Làm cách nào để mô phỏng OFFSET trong câu lệnh UPDATE của MySQL?

SELECT 
    title, 
    count(id) AS count 
FROM articles 
GROUP BY title 
HAVING count > 1 

Sau đó, tôi thay thế tất cả các chức danh tương tự có trống sử dụng một vòng lặp foreach và lệnh này:

UPDATE articles 
SET title = '' 
WHERE title = '$duplicate_title' 

Tôi muốn cập nhật articles bảng và thay thế tất cả các tiêu đề trùng lặp ngoại trừ mục nhập đầu tiên, dựa trên Điều ID ASC sử dụng một cái gì đó như thế này. Vấn đề là OFFSET dường như không hoạt động trong một UPDATE. Có cách nào để thực hiện điều này trong một truy vấn không?

UPDATE articles 
SET title = '' 
WHERE title = '$duplicate_title' 
ORDER BY id ASC 
OFFSET 1 

Trả lời

1
UPDATE articles a 
INNER JOIN articles b 
    ON a.title = b.title AND a.ID > b.ID 
SET title = ''; 

này về cơ bản nói

cập nhật tất cả các bài viết mà tồn tại một bài báo phù hợp với tiêu đề tương tự và một ID thấp

+0

bạn có thể giải thích những gì a và? cú pháp nào? Tôi đã nhìn thấy thứ như 'lừa đảo' trong các truy vấn khác và tôi đã không thể hiểu nó ngay cả sau khi đọc về những gì đang xảy ra. –

+1

'?' Là một trình giữ chỗ tham số thường được sử dụng trong [báo cáo đã chuẩn bị] (http://en.wikipedia.org/wiki/Prepared_statement) cho một ứng dụng khách tinh vi phù hợp (như mở rộng PDO của PHP) – Phil

+0

OK, tôi đã rõ ràng các ? và PDO. Bây giờ những gì 'UPDATE bài viết a' và' SELECT 1 FROM bài viết phụ' làm gì? Cụ thể, tôi có nghĩa là 'a' và' sub'. Đó có phải là lối tắt cho 'bài viết dưới dạng a' cho phép chúng tôi truy cập dữ liệu từ truy vấn bên ngoài trong truy vấn bên trong mà không có xung đột không? –

1

tôi tìm thấy một giải pháp đó là một chút bên ngoài phạm vi của câu hỏi ban đầu của tôi, nhưng có liên quan dù sao.

Tôi đã có số lượng bản sao từ truy vấn đầu tiên tìm thấy chúng. Tôi trừ một từ số này, sau đó ra lệnh truy vấn UPDATE của tôi bằng ID DESC và sau đó giới hạn truy vấn để đếm trừ một. Điều này phục vụ cùng một mục đích và loại bỏ tất cả các bản sao trừ mục nhập đầu tiên.

Dưới đây là các truy vấn UPDATE Tôi sử dụng:

UPDATE articles 
SET title = '' 
WHERE title = '$duplicate_title' 
ORDER BY id DESC 
LIMIT $duplicate_count_minus_one 
Các vấn đề liên quan