สถานการณ์
มีข้อมูล 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