ใช้ UNION (ไม่ซ้ำ) รวมค่าจากหลายคอลัมน์ แล้วกรอง NULL และจัดเรียง
mysql> CREATE TABLE DemoTable (
-> Value1 INT,
-> Value2 INT,
-> Value3 INT
-> );
Query OK, 0 rows affected (0.69 sec)
mysql> INSERT INTO DemoTable VALUES(20, NULL, NULL); Query OK, 1 row affected (0.19 sec) mysql> INSERT INTO DemoTable VALUES(20, NULL, NULL); Query OK, 1 row affected (0.11 sec) mysql> INSERT INTO DemoTable VALUES(20, NULL, NULL); Query OK, 1 row affected (0.12 sec) mysql> INSERT INTO DemoTable VALUES(10, NULL, NULL); Query OK, 1 row affected (0.10 sec) mysql> INSERT INTO DemoTable VALUES(80, 20, 100); Query OK, 1 row affected (0.09 sec) mysql> INSERT INTO DemoTable VALUES(10, NULL, NULL); Query OK, 1 row affected (0.16 sec)
mysql> SELECT * FROM DemoTable;
+--------+--------+--------+ | Value1 | Value2 | Value3 | +--------+--------+--------+ | 20 | NULL | NULL | | 20 | NULL | NULL | | 20 | NULL | NULL | | 10 | NULL | NULL | | 80 | 20 | 100 | | 10 | NULL | NULL | +--------+--------+--------+ 6 rows in set (0.00 sec)
รวมค่าจาก 3 คอลัมน์ แล้วเอาค่าที่ไม่ซ้ำและไม่ NULL:
mysql> SELECT * FROM (
-> SELECT Value1 AS AllValue FROM DemoTable
-> UNION
-> SELECT Value2 AS AllValue FROM DemoTable
-> UNION
-> SELECT Value3 AS AllValue FROM DemoTable
-> ) tbl WHERE AllValue IS NOT NULL
-> ORDER BY AllValue;
+----------+ | AllValue | +----------+ | 10 | | 20 | | 80 | | 100 | +----------+ 4 rows in set (0.00 sec)
ข้อแตกต่าง: UNION = Distinct (ไม่ซ้ำ), UNION ALL = รวมทั้งหมด (รวมซ้ำ) เร็วกว่า