Để lấy các cặp giá trị duy nhất từ 2 cột (coi (A,B) và (B,A) là trùng nhau), dùng LEAST() và GREATEST().
Cú pháp
SELECT DISTINCT LEAST(col1, col2) AS first_col, GREATEST(col1, col2) AS second_col FROM table_name;
Ví dụ minh họa
mysql> CREATE TABLE SelectDistinctTwoColumns ( StudentId INT, EmployeeId INT ); Query OK, 0 rows affected (0.60 sec) mysql> INSERT INTO SelectDistinctTwoColumns VALUES (100,101), (102,103), (104,105), (100,101), (102,103), (106,107), (104,105), (105,104); -- (105,104) đảo ngược (104,105) Query OK, 8 rows affected
Dữ liệu gốc:
+-----------+------------+ | StudentId | EmployeeId | +-----------+------------+ | 100 | 101 | | 102 | 103 | | 104 | 105 | | 100 | 101 | | 102 | 103 | | 106 | 107 | | 104 | 105 | | 105 | 104 | -- đảo ngược +-----------+------------+
Truy vấn distinct:
mysql> SELECT DISTINCT
LEAST(StudentId, EmployeeId) AS FirstColumn,
GREATEST(StudentId, EmployeeId) AS SecondColumn
FROM SelectDistinctTwoColumns;
Kết quả (4 cặp duy nhất, (104,105) và (105,104) gộp thành 1):
+-------------+--------------+ | FirstColumn | SecondColumn | +-------------+--------------+ | 100 | 101 | | 102 | 103 | | 104 | 105 | | 106 | 107 | +-------------+--------------+
Giải thích
LEAST(a,b)trả về giá trị nhỏ hơn.GREATEST(a,b)trả về giá trị lớn hơn.- Kết hợp: chuẩn hóa cặp (min, max) để (A,B) và (B,A) thành giống nhau.
DISTINCTsau đó loại bỏ trùng lặp.
Lưu ý
- Chỉ hoạt động đúng nếu so sánh được (cùng kiểu số, hoặc cùng kiểu chuỗi).
- Nếu có NULL:
LEAST/GREATESTtrả về NULL → cặp đó bị loại hoặc nhóm riêng. - Cách khác:
SELECT DISTINCT col1, col2 FROM table WHERE col1 <= col2 UNION SELECT DISTINCT col2, col1 FROM table WHERE col1 > col2(phức tạp hơn).