Một giải pháp rất khó hiểu là lấy thread_id được sắp xếp theo view_count trong GROUP_CONCAT
. Sau đó, chúng ta có thể sử dụng các thao tác chuỗi để lấy thread_id với tối thiểu view_count .
Trong SELECT của bạn mệnh đề, thay vì t.thread_id , bạn có thể thử những cách sau:
SUBSTRING_INDEX(GROUP_CONCAT(DISTINCT t.thread_id
ORDER BY t.view_count ASC
SEPARATOR ','),
',',
1) AS thread_id_with_minimum_views
Bây giờ, dựa trên SELECT truy vấn để xác định các bản ghi trùng lặp với Chế độ xem tối thiểu, DELETE truy vấn để xóa các bản ghi như vậy khỏi xf_thread bảng sẽ như sau:
DELETE t_delete FROM xf_thread AS t_delete
INNER JOIN (SELECT CAST(SUBSTRING_INDEX(GROUP_CONCAT(DISTINCT t.thread_id ORDER BY t.view_count ASC SEPARATOR ','), ',', 1) AS UNSIGNED) AS tid_min_view
FROM (SELECT * FROM xf_thread) t
INNER JOIN xf_post p ON p.thread_id = t.thread_id
WHERE t.first_post_id = p.post_id
AND t.user_id = 0
AND t.reply_count < 2
GROUP BY t.title, t.username, p.message
HAVING Count(t.title) > 1
AND Count(t.username) > 1
AND Count(p.message) > 1
ORDER BY t.thread_id) AS t_dup
ON t_delete.thread_id = t_dup.tid_min_view