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

ค้นหาแถวซ้ำใน MySQL ด้วย Composite Key (หลายคอลัมน์)

การหา Duplicate Rows ตามหลายคอลัมน์ (Composite Key)

ใช้ GROUP BY หลายคอลัมน์ร่วมกับ HAVING COUNT(*) > 1 เพื่อหาชุดค่าที่ซ้ำกัน

สร้างตารางและข้อมูล

mysql> CREATE TABLE DemoTable1494 (
    -> ShippingDate DATETIME,
    -> CustomerCountryName VARCHAR(20)
    -> );
Query OK, 0 rows affected (0.63 sec)

mysql> INSERT INTO DemoTable1494 VALUES
    -> ('2018-09-10 12:34:50', 'US'),
    -> ('2019-09-10 12:34:50', 'AUS'),
    -> ('2018-09-10 11:00:00', 'US'),
    -> ('2017-12-31 01:10:40', 'UK'),
    -> ('2019-09-10 05:00:50', 'AUS');
Query OK, 5 rows affected

ข้อมูลทั้งหมด

+---------------------+---------------------+
| ShippingDate        | CustomerCountryName |
+---------------------+---------------------+
| 2018-09-10 12:34:50 | US                  |
| 2019-09-10 12:34:50 | AUS                 |
| 2018-09-10 11:00:00 | US                  |
| 2017-12-31 01:10:40 | UK                  |
| 2019-09-10 05:00:50 | AUS                 |
+---------------------+---------------------+

คำสั่ง: หาคู่ (วันที่, ประเทศ) ที่ซ้ำกัน (นับตามวันที่ ไม่ใช่เวลา)

mysql> SELECT ShippingDate, CustomerCountryName, COUNT(*) AS c
    -> FROM DemoTable1494
    -> GROUP BY DATE(ShippingDate), CustomerCountryName
    -> HAVING c >= 2
    -> ORDER BY c;

ผลลัพธ์

+---------------------+---------------------+---+
| ShippingDate        | CustomerCountryName | c |
+---------------------+---------------------+---+
| 2018-09-10 12:34:50 | US                  | 2 |
| 2019-09-10 12:34:50 | AUS                 | 2 |
+---------------------+---------------------+---+
2 rows in set (0.00 sec)

คำอธิบาย

  • GROUP BY DATE(ShippingDate), CustomerCountryName - จัดกลุ่มตาม วันที่ (ตัดเวลา) และประเทศ
  • HAVING c >= 2 - กรองเฉพาะกลุ่มที่มี 2 แถวขึ้นไป
  • ผลลัพธ์แสดง แถวแรกของแต่ละกลุ่ม (MySQL คืนค่า non-aggregated column แบบไม่แน่นอน)

⚠️ ข้อควรระวัง

ShippingDate ในผลลัพธ์อาจไม่ใช่ค่าที่แน่นอน
MySQL (ก่อน v5.7.5 / ONLY_FULL_GROUP_BY) อนุญาตให้ SELECT คอลัมน์ที่ไม่ได้อยู่ใน GROUP BY และไม่ได้อยู่ใน Aggregate Function ค่าที่ได้อาจเป็นแถวไหนก็ได้ในกลุ่มนั้น

แนะนำ: ใช้ MIN(ShippingDate) หรือ MAX(ShippingDate) ใน SELECT แทน

เวอร์ชันที่ปลอดภัย (Strict SQL Mode)

SELECT MIN(ShippingDate) AS FirstShippingDate, CustomerCountryName, COUNT(*) AS cnt
FROM DemoTable1494
GROUP BY DATE(ShippingDate), CustomerCountryName
HAVING cnt >= 2;