2009-12-14 34 views
7

Tôi có một bảng được gắn thẻ với hai trường sesskey (varchar32, index) và các sản phẩm (int11), bây giờ tôi phải xóa tất cả các hàng có nhóm bằng số đếm sesskey (*) = 1. Tôi đang thử một vài phương pháp nhưng tất cả đều không thành công.MYSQL xóa tất cả kết quả có số (*) = 1

Ví dụ:

delete from taged where sesskey in (select sesskey from taged group by sesskey having count(*) = 1) 

Trường sesskey không thể là một khóa chính vì lặp đi lặp lại của nó.

Trả lời

9
DELETE si 
FROM t_session si 
JOIN (
     SELECT sesskey 
     FROM t_session so 
     GROUP BY 
       sesskey 
     HAVING COUNT(*) = 1 
     ) q 
ON  q.sesskey = si.sesskey 

Bạn cần tham gia tại đây. Sử dụng truy vấn con tương quan sẽ không hoạt động.

Xem bài viết này trong blog của tôi để xem chi tiết hơn:

+0

vì một số lý do điều này không làm việc cho tôi trong một phiên bản mysql gần đây. Tôi đã phải sử dụng ví dụ từ blog của bạn (LEFT JOIN, ID IS NULL). Tôi quản lý để xóa các hàng sai cũng: p (đã phải sử dụng IS NOT NULL cho trường hợp của tôi) – Spikolynn

1

subquery nên làm việc

Delete from taged 
    Where sesskey in 
    (Select sesskey 
     From taged 
     Group by sesskey 
     Having count(*) = 1) 

EDIT: Nhờ @Quassnoi bình luận dưới đây ... Các sẽ KHÔNG công việc trên trong MySql, như MySql hạn chế tham khảo bàn đang được cập nhật hoặc xóa khỏi, trong một Subquery i, bạn phải làm điều tương tự bằng cách sử dụng một ...

+0

sẽ không hoạt động (15 ký tự) – Quassnoi

+0

# 1093 - Bạn không thể chỉ định bảng mục tiêu 'taged' cho cập nhật trong mệnh đề FROM – Alex

+0

Lỗi đó gây nhầm lẫn ... Không có "Cập nhật" đang diễn ra ở đây ... Nó đề cập đến điều gì? Việc sử dụng tablename trong mệnh đề Delet? hoặc việc sử dụng tablename trong truy vấn phụ (không cập nhật hoặc xóa bất kỳ thứ gì) –

1

Hoặc nếu bạn đang sử dụng cũ (trước 4.1) phiên bản của MySQL và không có quyền truy cập vào các truy vấn con bạn cần chọn dữ liệu của bạn vào một bảng, sau đó tham gia rằng bảng với bản gốc:

CREATE TABLE delete_me_table (sesskey varchar32, cur_total int); 

INSERT INTO delete_me_table SELECT sesskey, count(*) as cur_total FROM orig_table 
WHERE cur_total = 1 GROUP BY sesskey; 

DELETE FROM orig_table INNER JOIN delete_me_table USING (sesskey); 

Bây giờ bạn có một bảng còn sót lại tên delete_me_table trong đó có một lịch sử của tất cả các hàng bạn đã xóa. Bạn có thể sử dụng điều này để lưu trữ, xu hướng, những điều thú vị và bất thường khác khiến bạn ngạc nhiên.

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