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

รวมคอลัมน์จากตารางต่างกันด้วย CONCAT และ JOIN ใน MySQL


สถานการณ์

มีข้อมูล FirstName ในตารางหนึ่ง และ LastName ในอีกตาราง ต้องการรวมเป็น Full Name ใน Query เดียว

วิธีแก้: ใช้ CONCAT() ร่วมกับ JOIN

CONCAT(str1, str2, ...) รวมสตริงหลายตัวเป็นสตริงเดียว

ตัวอย่างการใช้งาน

1. สร้างตารางแรก (FirstName)

mysql> CREATE TABLE DemoTable1 (
    -> FirstName VARCHAR(20)
    -> );
Query OK, 0 rows affected (0.90 sec)

2. เพิ่มข้อมูล

mysql> INSERT INTO DemoTable1 VALUES('Chris');
Query OK, 1 row affected (0.12 sec)
mysql> INSERT INTO DemoTable1 VALUES('David');
Query OK, 1 row affected (0.12 sec)

3. สร้างตารางที่สอง (LastName)

mysql> CREATE TABLE DemoTable2 (
    -> LastName VARCHAR(20)
    -> );
Query OK, 0 rows affected (0.95 sec)

4. เพิ่มข้อมูล

mysql> INSERT INTO DemoTable2 VALUES('Brown');
Query OK, 1 row affected (0.55 sec)
mysql> INSERT INTO DemoTable2 VALUES('Miller');
Query OK, 1 row affected (0.18 sec)

5. รวมข้อมูลด้วย LEFT JOIN และ CONCAT

mysql> SELECT CONCAT(tbl1.FirstName, ' ', tbl2.LastName) 
    -> FROM DemoTable1 tbl1
    -> LEFT JOIN DemoTable2 tbl2
    -> ON tbl2.LastName = 'Brown' OR tbl2.LastName = 'Miller';

ผลลัพธ์ (Cartesian Product - ทุกคู่):

+------------------------------------------+
| concat(tbl1.FirstName,' ',tbl2.LastName) |
+------------------------------------------+
| Chris Brown                              |
| David Brown                              |
| Chris Miller                             |
| David Miller                             |
+------------------------------------------+
4 rows in set (0.04 sec)

การ JOIN แบบต่างๆ

JOIN Type ผลลัพธ์ ใช้เมื่อ
INNER JOIN เฉพาะคู่ที่ Match ทั้งสองฝั่ง ต้องมีข้อมูลครบคู่
LEFT JOIN ทุกแถวซ้าย + Match ขวา (NULL หาไม่เจอ) ต้องการข้อมูลซ้ายทั้งหมด
RIGHT JOIN ทุกแถวขวา + Match ซ้าย ต้องการข้อมูลขวาทั้งหมด
CROSS JOIN ทุกคู่ที่เป็นไปได้ (Cartesian Product) ไม่มีเงื่อนไข JOIN (เช่นตัวอย่าง)

ฟังก์ชัน CONCAT เพิ่มเติม

CONCAT_WS (With Separator)

CONCAT_WS(' ', FirstName, MiddleName, LastName)
-- จัดการ NULL อัตโนมัติ (ข้าม NULL, ไม่ใส่ Separator)

CONCAT กับ NULL

CONCAT('John', NULL, 'Doe') → NULL
COALESCE(FirstName, '') -- แปลง NULL เป็น Empty String ก่อน CONCAT

กรณีการใช้งานจริง

  • รวม First/Last Name → Full Name
  • รวม Address Line 1, 2, City, Province → Full Address
  • สร้าง Slug/URL จากหลายคอลัมน์
  • Export ข้อมูลเป็น CSV Format

ข้อควรระวัง

  • ตัวอย่างเดิมใช้ LEFT JOIN โดยไม่มี ON Condition ที่เชื่อม Primary-Foreign Key → Cartesian Product
  • Production ควรมี Foreign Key Relationship ชัดเจน
  • CONCAT คืนค่า NULL หาก Argument ใดเป็น NULL → ใช้ COALESCE หรือ CONCAT_WS