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

วิธีแสดงคอลัมน์จาก 2 ตารางต่างกัน พร้อมจัดเรียงด้วย ORDER BY ใน MySQL

การรวมคอลัมน์จากตารางต่างกันด้วย 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    |
+--------+

การทำงาน

  1. SELECT DISTINCT Amount FROM DemoTable1 → 134, 234, 567
  2. SELECT DISTINCT Price FROM DemoTable2 → 121, 134, 775, 882
  3. UNION รวมและลบซ้ำ (134 ซ้ำ) → 121, 134, 234, 567, 775, 882
  4. ORDER 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 ท้ายสุดจะจำกัดผลลัพธ์รวมทั้งหมด