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

SELECT DISTINCT ค่าจาก 2 คอลัมน์ใน MySQL ใช้ LEAST และ GREATEST


ปัญหา: 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