การหา 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 ค่าที่ได้อาจเป็นแถวไหนก็ได้ในกลุ่มนั้น
แนะนำ: ใช้
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;