Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

เลือกแถวที่มีค่าซ้ำในคอลัมน์ MySQL

การค้นหาแถวที่มีค่าซ้ำในคอลัมน์เฉพาะ (Duplicate Values) ใน MySQL

ใช้ SELF JOIN เปรียบเทียบแถวในตารางเดียวกัน โดย Join บนคอลัมน์ที่ต้องการตรวจสอบ และกรอง ID ไม่เท่ากัน

ตัวอย่างการใช้งาน

สร้างตารางและเพิ่มข้อมูล (Larry ซ้ำ):

mysql> create table DemoTable (UserId int, UserName varchar(20));
mysql> insert into DemoTable values(10,'John');
mysql> insert into DemoTable values(11,'Sam');
mysql> insert into DemoTable values(12,'Larry');
mysql> insert into DemoTable values(13,'David');
mysql> insert into DemoTable values(14,'Larry');

ข้อมูล:

+--------+----------+
| UserId | UserName |
+--------+----------+
| 10     | John     |
| 11     | Sam      |
| 12     | Larry    |
| 13     | David    |
| 14     | Larry    |
+--------+----------+

คิวรีหาแถวที่ UserName ซ้ำ (Self Join):

mysql> SELECT DISTINCT tbl1.* FROM DemoTable tbl1 
    JOIN DemoTable tbl2 ON tbl2.UserId <> tbl1.UserId AND tbl2.UserName = tbl1.UserName;
+--------+----------+
| UserId | UserName |
+--------+----------+
| 14     | Larry    |
| 12     | Larry    |
+--------+----------+

วิธีที่พบบ่อยกว่า (GROUP BY + HAVING):

SELECT UserName, COUNT(*) as cnt FROM DemoTable GROUP BY UserName HAVING COUNT(*) > 1;

คืนค่า: Larry | 2 (เฉพื่อชื่อที่ซ้ำ และจำนวน)

หาแถวทั้งหมดที่ซ้ำ (รวมแถวแรก):

SELECT * FROM DemoTable WHERE UserName IN (
    SELECT UserName FROM DemoTable GROUP BY UserName HAVING COUNT(*) > 1
);

MySQL 8.0+ Window Function:

SELECT * FROM (
    SELECT *, COUNT(*) OVER (PARTITION BY UserName) as cnt FROM DemoTable
) t WHERE cnt > 1;