การรวมคอลัมน์จากตารางต่างกันด้วย UNION และจัดเรียงด้วย ORDER BY
เมื่อต้องการดึงคอลัมน์จากตารางต่างกันมาแสดงรวมกันในคอลัมน์เดียว ให้ใช้ UNION (หรือ UNION ALL) แล้วตามด้วย ORDER BY ที่ท้ายสุด
กฎของ UNION
- จำนวนคอลัมน์ในทุก SELECT ต้องเท่ากัน
- ชนิดข้อมูลของคอลัมน์ที่ตรงตำแหน่งต้องเข้ากันได้
UNION= ลบแถวซ้ำ (DISTINCT) |UNION ALL= เก็บทุกแถว (เร็วกว่า)ORDER BYต้องอยู่ท้ายสุด ใช้ชื่อคอลัมน์หรือตำแหน่ง (1, 2, ...)
ตัวอย่าง: รวม Amount จากตาราง 1 และ Price จากตาราง 2 แล้วเรียงน้อยไปมาก
1. สร้างตารางและเพิ่มข้อมูล
CREATE TABLE DemoTable1 (Amount INT);
INSERT INTO DemoTable1 VALUES (234), (567), (134);
CREATE TABLE DemoTable2 (Price INT);
INSERT INTO DemoTable2 VALUES (134), (775), (121), (882);
2. รวมและจัดเรียง
SELECT DISTINCT Amount FROM DemoTable1
UNION
SELECT DISTINCT Price FROM DemoTable2
ORDER BY Amount;
ผลลัพธ์:
+--------+
| Amount |
+--------+
| 121 |
| 134 |
| 234 |
| 567 |
| 775 |
| 882 |
+--------+
การทำงาน
SELECT DISTINCT Amount FROM DemoTable1→ 134, 234, 567SELECT DISTINCT Price FROM DemoTable2→ 121, 134, 775, 882UNIONรวมและลบซ้ำ (134 ซ้ำ) → 121, 134, 234, 567, 775, 882ORDER BY Amountเรียงน้อยไปมาก
ใช้ UNION ALL (เร็วกว่า หากไม่ต้องการลบซ้ำ)
SELECT Amount FROM DemoTable1
UNION ALL
SELECT Price FROM DemoTable2
ORDER BY Amount;
ผลลัพธ์จะมี 134 สองครั้ง (จากทั้ง 2 ตาราง)
การจัดเรียงหลายคอลัมน์
SELECT col1, col2 FROM table1
UNION ALL
SELECT col1, col2 FROM table2
ORDER BY col1 DESC, col2 ASC;
ใช้ CTE (MySQL 8.0+) อ่านง่ายกว่า
WITH Combined AS (
SELECT Amount AS Value FROM DemoTable1
UNION ALL
SELECT Price FROM DemoTable2
)
SELECT DISTINCT Value FROM Combined ORDER BY Value;
ข้อควรระวัง
- ชื่อคอลัมน์ในผลลัพธ์ จะใช้ชื่อจาก SELECT ตัวแรก (Amount ในตัวอย่าง)
- ไม่สามารถใช้
ORDER BYภายในแต่ละ SELECT ของ UNION ได้ (ยกเว้นมี LIMIT) LIMITท้ายสุดจะจำกัดผลลัพธ์รวมทั้งหมด