เมื่อต้องการนับจำนวนแถวจากหลายตารางแล้วนำมาบวกกัน สามารถใช้ subquery ใน SELECT clause ได้
รูปแบบคำสั่ง
SELECT
(SELECT COUNT(*) FROM table1) +
(SELECT COUNT(*) FROM table2) +
(SELECT COUNT(*) FROM table3) AS total_records;
ตัวอย่างการใช้งาน
1. เตรียมตารางตัวอย่าง 3 ตาราง
-- ตารางที่ 1: users (5 แถว)
CREATE TABLE users (Id INT, UserName VARCHAR(20), UserLastseen DATETIME);
INSERT INTO users VALUES
(1, 'Larry', '2019-01-15 02:45:00'),
(2, 'Sam', '2019-01-15 15:01:52'),
(3, 'Mike', '2019-01-15 02:30:00'),
(4, 'Bob', '2019-01-15 15:02:00'),
(5, 'David', '2019-01-15 14:55:00');
-- ตารางที่ 2: sortingstringdemo (5 แถว)
CREATE TABLE sortingstringdemo (Amount DECIMAL(10,2));
INSERT INTO sortingstringdemo VALUES (12.34), (124.50), (9.59), (150.68), (600.54);
-- ตารางที่ 3: userlogintable (3 แถว)
CREATE TABLE userlogintable (Id INT, UserId INT, UserLoginDateTime DATETIME);
INSERT INTO userlogintable VALUES
(1, 2, '2019-01-27 13:47:20'),
(3, 2, '2019-01-26 11:30:30'),
(4, 1, '2015-03-11 15:23:55');
2. คำสั่งรวม COUNT จาก 3 ตาราง
SELECT
(SELECT COUNT(*) FROM users) +
(SELECT COUNT(*) FROM sortingstringdemo) +
(SELECT COUNT(*) FROM userlogintable) AS TotalRecords;
ผลลัพธ์:
+--------------+
| TotalRecords |
+--------------+
| 13 |
+--------------+
คำนวณ: 5 + 5 + 3 = 13 ✓
วิธีทางเลือก: ใช้ UNION ALL
SELECT SUM(cnt) AS TotalRecords FROM (
SELECT COUNT(*) AS cnt FROM users
UNION ALL
SELECT COUNT(*) FROM sortingstringdemo
UNION ALL
SELECT COUNT(*) FROM userlogintable
) AS sub;
วิธีนี้ยืดหยุ่นกว่า หากต้องการเพิ่มตารางใหม่ แค่เพิ่ม UNION ALL SELECT COUNT(*) FROM new_table
วิธีทางเลือก: ใช้ CTE (MySQL 8.0+)
WITH counts AS (
SELECT 'users' AS tbl, COUNT(*) AS cnt FROM users
UNION ALL SELECT 'sortingstringdemo', COUNT(*) FROM sortingstringdemo
UNION ALL SELECT 'userlogintable', COUNT(*) FROM userlogintable
)
SELECT SUM(cnt) AS TotalRecords FROM counts;
CTE อ่านง่ายและดีบั๊กง่ายกว่า เพราะเห็นจำนวนแต่ละตารางแยกกัน
สรุป
- Subquery ใน SELECT - เรียบง่าย สำหรับตารางไม่มาก
- UNION ALL - ยืดหยุ่น สำหรับตารางเยอะ
- CTE - อ่านง่าย สำหรับ MySQL 8.0+