Tìm các hàng có cùng giá trị trên một cột trong MySQL


209

Trong bảng [thành viên], một số hàng có cùng giá trị cho emailcột.

login_id | email
---------|---------------------
john     | john123@hotmail.com
peter    | peter456@gmail.com
johnny   | john123@hotmail.com
...

Một số người đã sử dụng một login_id khác nhau nhưng cùng một địa chỉ email, không có ràng buộc duy nhất nào được đặt trên cột này. Bây giờ tôi cần tìm những hàng này và xem chúng có nên được gỡ bỏ không.

Tôi nên sử dụng câu lệnh SQL nào để tìm các hàng này? (MySQL 5)

Câu trả lời:


341

Truy vấn này sẽ cung cấp cho bạn danh sách các địa chỉ email và số lần chúng được sử dụng, với các địa chỉ được sử dụng nhiều nhất trước tiên.

SELECT email,
       count(*) AS c
FROM TABLE
GROUP BY email
HAVING c > 1
ORDER BY c DESC

Nếu bạn muốn các hàng đầy đủ:

select * from table where email in (
    select email from table
    group by email having count(*) > 1
)

1
count(1)hoạt động tốt như nhau, và là hiệu suất cao hơn. (Học kinh nghiệm mà lừa từ Stack Overflow ;-)
jpaugh

3
@jpaugh, có thể không muốn sử dụng count(1) stackoverflow.com/questions/2710621/ cấp
Bão

đã tạo ra những gì về cơ bản là đệ quy vô hạn hoặc một cái gì đó trên mysql dẫn đến cơ sở dữ liệu đã chết do "quá nhiều kết nối": - /
huygir


13

Đây là truy vấn để tìm emailnhững cái được sử dụng cho nhiều hơn một login_id:

SELECT email
FROM table
GROUP BY email
HAVING count(*) > 1

Bạn sẽ cần truy vấn thứ hai (của lồng nhau) để có được danh sách login_idtheo email.


10

Phần đầu tiên của câu trả lời được chấp nhận không hoạt động cho MSSQL.
Điều này làm việc cho tôi:

select email, COUNT(*) as C from table 
group by email having COUNT(*) >1 order by C desc

5

sử dụng điều này nếu cột email của bạn chứa các giá trị trống

 select * from table where email in (
    select email from table group by email having count(*) > 1 and email != ''
    )

3

Tôi biết đây là một câu hỏi rất cũ nhưng điều này nhiều hơn cho những người khác có thể có cùng một vấn đề và tôi nghĩ rằng điều này chính xác hơn với những gì đã muốn.

SELECT * FROM member WHERE email = (Select email From member Where login_id = john123@hotmail.com) 

Điều này sẽ trả về tất cả các bản ghi có john123@hotmail.com làm giá trị login_id.


2

Cảm ơn các bạn :-) Tôi đã sử dụng phần dưới đây vì tôi chỉ quan tâm đến hai cột đó và không quá nhiều về phần còn lại. Làm việc tuyệt vời

  select email, login_id from table
    group by email, login_id
    having COUNT(email) > 1

2
Trong trường hợp được đề cập, COUNT (email) sẽ luôn là 1, vì vậy truy vấn của bạn sẽ không trả về gì.
jutky

Không, truy vấn thực sự đã cung cấp cho tôi dữ liệu tôi cần, rõ ràng là email và tên đăng nhập của những người có cùng email
Libertine

Nếu bạn nhóm theo email login_id, bạn sẽ đếm số lượng hàng cho cùng một email và đăng nhập, và những hàng đó là khác biệt trong ví dụ của bạn, vì vậy số đếm sẽ luôn là 1. Đây là câu đố với truy vấn của bạn trả về 0 hàng: sqlfiddle. com / #! 9 / 4bbcaf / 3
vui nhộn

1

Nhận toàn bộ bản ghi như bạn muốn bằng cách sử dụng điều kiện với truy vấn chọn bên trong.

SELECT *
FROM   member
WHERE  email IN (SELECT email
                 FROM   member
                 WHERE  login_id = abcd.user@hotmail.com) 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.