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

วิธีหาค่าสูงสุดและต่ำสุดจาก 2 ตารางในคำสั่ง MySQL เดียวด้วย UNION

การหาค่าสูงสุดและต่ำสุดจากหลายตารางด้วย UNION และ Aggregate Functions

เมื่อต้องการหาค่าสูงสุด (MAX) และต่ำสุด (MIN) จากคอลัมน์ที่อยู่ในตารางต่างกัน ให้ใช้ UNION รวมข้อมูลก่อน แล้วค่อยใช้ Aggregate Function

รูปแบบคำสั่ง

SELECT MAX(common_col) AS max_val, MIN(common_col) AS min_val
FROM (
    SELECT col1 AS common_col FROM table1
    UNION
    SELECT col2 AS common_col FROM table2
) AS combined;

ตัวอย่าง: หาคะแนนสูงสุดและต่ำสุดจาก 2 ตาราง

1. สร้างตารางและเพิ่มข้อมูล

CREATE TABLE DemoTable1 (
    UniqueId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    Score1 INT
);

INSERT INTO DemoTable1 (Score1) VALUES (56), (76), (65);

CREATE TABLE DemoTable2 (
    UniqueId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    Score2 INT
);

INSERT INTO DemoTable2 (Score2) VALUES (67), (94), (98);

2. ดูข้อมูลทั้งสองตาราง

SELECT * FROM DemoTable1;
SELECT * FROM DemoTable2;

DemoTable1: 56, 76, 65 | DemoTable2: 67, 94, 98

3. หาค่าสูงสุดและต่ำสุดรวม 2 ตาราง

SELECT 
    MAX(commonValue) AS Highest_Value,
    MIN(commonValue) AS Lowest_Value
FROM (
    SELECT Score1 AS commonValue FROM DemoTable1
    UNION
    SELECT Score2 AS commonValue FROM DemoTable2
) AS tbl;

ผลลัพธ์:

+---------------+--------------+
| Highest_Value | Lowest_Value |
+---------------+--------------+
| 98            | 56           |
+---------------+--------------+

คำอธิบาย

  • UNION รวมผลลัพธ์ของ 2 SELECT และ ลบค่าซ้ำ (DISTINCT โดยอัตโนมัติ)
  • UNION ALL จะรวมค่าซ้ำด้วย (เร็วกว่า หากแน่ใจว่าไม่ซ้ำหรือต้องการซ้ำ)
  • Subquery ต้องมี AS tbl (Alias) ตามกฎของ MySQL
  • คอลัมน์ใน UNION ต้องมีจำนวนและชนิดข้อมูลตรงกัน

ขยายไปหลายตาราง

SELECT MAX(val) AS MaxVal, MIN(val) AS MinVal FROM (
    SELECT Score1 AS val FROM Table1
    UNION ALL
    SELECT Score2 AS val FROM Table2
    UNION ALL
    SELECT Score3 AS val FROM Table3
    UNION ALL
    SELECT Score4 AS val FROM Table4
) AS all_scores;

ประสิทธิภาพ

  • หากตารางใหญ่ ให้เพิ่ม Index บนคอลัมน์ที่ต้องการ MAX/MIN
  • UNION ALL เร็วกว่า UNION เพราะไม่ต้องตรวจสอบค่าซ้ำ
  • สำหรับตารางใหญ่มาก ควรคำนวณ MAX/MIN แยกตารางก่อน แล้วรวมใน Application Layer

กรณีต้องการรู้ว่าค่าสูงสุดมาจากตารางไหน

SELECT 'Table1' AS source, MAX(Score1) AS val FROM DemoTable1
UNION ALL
SELECT 'Table2', MAX(Score2) FROM DemoTable2
ORDER BY val DESC LIMIT 1;