2011-06-23 84 views
25

Tôi có một bảng các cầu thủ bóng chày (tất cả 1000 hoặc lâu hơn), với các lĩnh vực:Làm thế nào để kiểm tra các bản sao trong bảng mysql trên nhiều cột

mysql> describe person; 
+-----------+-------------+------+-----+---------+----------------+ 
| Field  | Type  | Null | Key | Default | Extra   | 
+-----------+-------------+------+-----+---------+----------------+ 
| id  | int(11)  | NO | PRI | NULL | auto_increment | 
| firstname | varchar(30) | NO |  | NULL |    | 
| lastname | varchar(30) | NO |  | NULL |    | 
+-----------+-------------+------+-----+---------+----------------+ 

Nhưng tôi nghĩ rằng có một số người chơi đã gạt được thêm vào trong hai lần. Làm thế nào tôi có thể đi qua và kiểm tra bao nhiêu lần xuất hiện của một firstname cụ thể, lastname combo?

+2

Làm những gì @RC nói, sau đó thêm '(firstname, lastname)' unique key – Mikhail

Trả lời

60

này cung cấp danh sách các bản sao:

SELECT firstname, lastname, COUNT(*) 
FROM person 
GROUP BY firstname, lastname 
HAVING COUNT(*) > 1; 

Nếu bạn muốn xem tính cho mỗi hàng tháo có điều khoản:

SELECT firstname, lastname, COUNT(*) 
FROM person 
GROUP BY firstname, lastname; 
+3

Rõ ràng câu trả lời tốt nhất có thể. –

+0

Hoàn hảo !!! Cảm ơn – Mohanraj

4
SELECT firstname, lastname, count(id) count 
    FROM person 
WHERE firstname = ? 
    AND lasttname = ? 
GROUP BY firstname, lastname 
+0

chỉ cho bạn biết _if_ một người cụ thể là một bản sao, chứ không phải _which_ người bị trùng lặp. – Alnitak

+0

Vâng, đó là những gì đã được hỏi. – manji

+0

ah, vâng, tôi hiểu ý của bạn là gì. Tôi tin rằng anh ta có nghĩa _particular_ như trong _ "khác biệt" _, chứ không phải là _ "cụ thể" _. Tôi đã mơ hồ tương tự như trong bình luận của tôi, nơi tôi đã thực sự có nghĩa là _ "cụ thể" _! :) – Alnitak

2

Đối với một danh sách được sắp xếp bằng cách giảm giá trị của số lượng bản sao:

SELECT firstname, lastname, COUNT(*) AS n 
    FROM person 
GROUP BY firstname, lastname 
ORDER BY n DESC 
HAVING n > 1 

Mệnh đề HAVING là phần quan trọng - cần phải lọc kết quả sau mệnh đề GROUP BY, vì mệnh đề WHERE lọc ra các hàng trước chúng được nhóm lại.

1

Để có được id của tên trùng lặp cũng như tên làm:

SELECT p1.id, p1.firstname, p1,lastname FROM person p1 
INNER JOIN person p2 ON (p1.firstname = p2.firstname 
         AND p1.lastname = p1.lastname 
         AND p1.id <> p2.id); 
+0

@Alnitak, đừng nghe những gì tôi nói, lắng nghe ý tôi là :-). – Johan

1

Nếu bạn chỉ muốn xóa tất cả các bản sao, bạn có thể làm một bảng tạm thời và điền nó với tất cả các bạn re data except the duplicate and them re-update you lại bảng tiểu học .

Truy vấn để chọn dữ liệu với trùng lặp sẽ này

SELECT DISTINCT firstname, lastname FROM table 

Để có được danh sách đầy đủ của dữ liệu trong bảng bạn đang

SELECT firstname, lastname, COUNT(*) AS n 
    FROM person 
GROUP BY firstname, lastname 
ORDER BY lastname DESC 
HAVING n > 1 

Với truy vấn cuối cùng này, bạn sẽ nhận được một danh sách dữ liệu được sắp xếp theo họ Cuối cùng.

1

Để tìm bản ghi trùng lặp (ví dụ: để tìm tên đăng nhập và mật khẩu kết hợp các bản ghi trùng lặp) trong bảng sử dụng truy vấn dưới đây;

SELECT em.* FROM employee_master AS em JOIN 
(SELECT emp.login, emp.password, COUNT(*) 
    FROM employee_master emp 
    WHERE emp.login != '' AND emp.password != '' 
    GROUP BY emp.login, emp.PASSWORD 
    HAVING COUNT(*) > 1 
) AS dl 
WHERE em.login = dl.login AND em.password = dl.password; 
Các vấn đề liên quan