Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Chọn giá trị DISTINCT từ hai cột trong MySQL


Để 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.
  • DISTINCT sau đó 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/GREATEST trả 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).