ปัญหา: DISTINCT บน 2 คอลัมน์ที่สลับตำแหน่ง
หากมีคู่ค่า (100,101) และ (101,100) ควรนับเป็นคู่เดียวกัน ต้องจัดลำดับค่าให้เล็ก-ใหญ่ก่อน
ใช้ LEAST() และ GREATEST()
LEAST(a,b)- คืนค่าที่น้อยกว่าGREATEST(a,b)- คืนค่าที่มากกว่า
ไวยากรณ์
SELECT DISTINCT
LEAST(col1, col2) AS first_col,
GREATEST(col1, col2) AS second_col
FROM your_table;
ตัวอย่างการใช้งาน
สร้างตารางและข้อมูล (มีค่าซ้ำและสลับตำแหน่ง)
CREATE TABLE SelectDistinctTwoColumns (StudentId INT, EmployeeId INT);
INSERT INTO SelectDistinctTwoColumns VALUES
(100, 101), (102, 103), (104, 105),
(100, 101), (102, 103), (106, 107),
(104, 105), (105, 104); -- สลับตำแหน่ง
ข้อมูลทั้งหมด
+-----------+------------+
| StudentId | EmployeeId |
+-----------+------------+
| 100 | 101 |
| 102 | 103 |
| 104 | 105 |
| 100 | 101 |
| 102 | 103 |
| 106 | 107 |
| 104 | 105 |
| 105 | 104 | -- คู่นี้เท่ากับ (104,105)
+-----------+------------+
คำสั่ง SELECT DISTINCT ด้วย LEAST/GREATEST
SELECT DISTINCT
LEAST(StudentId, EmployeeId) AS FirstColumn,
GREATEST(StudentId, EmployeeId) AS SecondColumn
FROM SelectDistinctTwoColumns;
ผลลัพธ์ (4 คู่ที่ไม่ซ้ำ)
+-------------+--------------+
| FirstColumn | SecondColumn |
+-------------+--------------+
| 100 | 101 |
| 102 | 103 |
| 104 | 105 |
| 106 | 107 |
+-------------+--------------+
กรณี 3 คอลัมน์ขึ้นไป
MySQL ไม่มี LEAST3/GREATEST3 ต้องใช้ CASE WHEN หรือ SORT ARRAY (MySQL 8.0+ JSON functions)
ประสิทธิภาพ
- ใช้ Index ได้หากมี Index บน (col1, col2)
- สำหรับตารางใหญ่ พิจารณา Materialized View หรือ Computed Column