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

MySQL: รวมผลลัพธ์ COUNT จากหลายตารางด้วย Subquery

เมื่อต้องการนับจำนวนแถวจากหลายตารางแล้วนำมาบวกกัน สามารถใช้ 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+