การจำลอง Array ใน MySQL ด้วย UNION ALL บนตาราง DUAL
MySQL ไม่มี Array Variable แบบ Built-in แต่สามารถสร้าง Result Set ที่ทำงานคล้าย Array ได้โดยใช้ UNION ALL รวมหลาย SELECT ... FROM DUAL (DUAL = Dummy Table 1 แถว)
ไวยากรณ์ (Syntax)
SELECT yourValue1 AS ArrayValue FROM DUAL
UNION ALL SELECT yourValue2 FROM DUAL
UNION ALL SELECT yourValue3 FROM DUAL
...
UNION ALL SELECT yourValueN FROM DUAL;
ตัวอย่าง: สร้าง "Array" ตัวเลข 1-10
mysql> SELECT 1 AS ArrayValue FROM DUAL
-> UNION ALL SELECT 2 FROM DUAL
-> UNION ALL SELECT 3 FROM DUAL
-> UNION ALL SELECT 4 FROM DUAL
-> UNION ALL SELECT 5 FROM DUAL
-> UNION ALL SELECT 6 FROM DUAL
-> UNION ALL SELECT 7 FROM DUAL
-> UNION ALL SELECT 8 FROM DUAL
-> UNION ALL SELECT 9 FROM DUAL
-> UNION ALL SELECT 10 FROM DUAL;
+------------+
| ArrayValue |
+------------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
| 10 |
+------------+
10 rows in set (0.00 sec)
คำอธิบาย
DUALเป็นตารางดमी (Dummy) มี 1 แถว 1 คอลัมน์ ใช้สำหรับ SELECT ที่ไม่ต้องการ FROM จริงUNION ALLรวม Result Set ทั้งหมด (ไม่ลบ Duplicate, เร็วกว่า UNION)- แต่ละ SELECT ต้องมีจำนวนและลำดับคอลัมน์เท่ากัน
- Alias
AS ArrayValueตัวแรกพอ ก็จะใช้ชื่อคอลัมน์นั้นสำหรับ Result Set ทั้งหมด
ประยุกต์ใช้จริง
-- สร้างตัวเลข 1-100 (Numbers Table)
SELECT @row := @row + 1 AS n FROM
(SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) t1,
(SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) t2,
(SELECT @row := 0) r
LIMIT 100;
-- MySQL 8.0+ ใช้ Recursive CTE แทน (ดีกว่ามาก)
WITH RECURSIVE nums(n) AS (
SELECT 1 UNION ALL SELECT n+1 FROM nums WHERE n < 100
) SELECT n FROM nums;
แนะนำ: MySQL 8.0+ ให้ใช้ WITH RECURSIVE CTE หรือ GENERATE_SERIES() (MariaDB) แทน UNION ALL ยาวๆ