2009-11-23 60 views
142

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

login_id | email 
---------|--------------------- 
john  | [email protected] 
peter | [email protected] 
johnny | [email protected] 
... 

Một số người đã sử dụng một login_id khác nhưng có cùng đị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 phải tìm những hàng này và xem chúng có bị loại bỏ hay 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)

Trả lời

227

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ó đầy đủ các hàng:

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

'đếm (1)' hoạt động tốt như nhau và có hiệu suất cao hơn. (Đã học được rằng mẹo từ [so] ;-) – jpaugh

+3

Không hoạt động với postgres. – jhrr

+1

@jpaugh, có thể không muốn sử dụng 'count (1)' https://stackoverflow.com/questions/2710621/count-vs-count1-vs-countpk-which-is-better – Storm

44
select email from mytable group by email having count(*) >1 
+4

Câu trả lời được chấp nhận không làm việc với Postgres, chương trình này thực hiện. – azio

+0

@HLGEM: http://stackoverflow.com/questions/41359879/postgresql-get-records-having-similar-column-values ​​ –

10

Đây là truy vấn để tìm email 's được sử dụng để biết thêm sau đó 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 các login_id bởi email.

9

phần Trước câu trả lời chấp nhận không làm việc cho MSSQL.
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 
1

Thanks guys :-) tôi đã sử dụng dưới đây vì tôi chỉ quan tâm đến những hai cột và không quá nhiều về phần còn lại. Làm việc rất lớn

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

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ì cả. – jutky

2

sử dụng này nếu cột email của bạn có chứa giá trị rỗng

select * from table where email in (
    select email from table group by email having count(*) > 1 and email != '' 
    ) 
Các vấn đề liên quan