Đếm số dòng của nhiều bảng trong một truy vấn MySQL
Sử dụng subquery trong mệnh đề SELECT để đếm số hàng của từng bảng riêng biệt, sau đó gom kết quả vào một hàng duy nhất.
Ví dụ minh họa
Tạo bảng DemoTable1:
mysql> CREATE TABLE DemoTable1 (FirstName VARCHAR(100)); Query OK, 0 rows affected (0.54 sec)
Chèn dữ liệu:
mysql> INSERT INTO DemoTable1 VALUES('Bob');
Query OK, 1 row affected (0.20 sec)
mysql> INSERT INTO DemoTable1 VALUES('James');
Query OK, 1 row affected (0.14 sec)
mysql> INSERT INTO DemoTable1 VALUES('John');
Query OK, 1 row affected (0.16 sec)
mysql> INSERT INTO DemoTable1 VALUES('David');
Query OK, 1 row affected (0.18 sec)
Tạo bảng DemoTable2:
mysql> CREATE TABLE DemoTable2 (Marks INT); Query OK, 0 rows affected (0.65 sec)
Chèn dữ liệu:
mysql> INSERT INTO DemoTable2 VALUES(98); Query OK, 1 row affected (0.14 sec) mysql> INSERT INTO DemoTable2 VALUES(89); Query OK, 1 row affected (0.11 sec) mysql> INSERT INTO DemoTable2 VALUES(67); Query OK, 1 row affected (0.14 sec) mysql> INSERT INTO DemoTable2 VALUES(34); Query OK, 1 row affected (0.19 sec) mysql> INSERT INTO DemoTable2 VALUES(32); Query OK, 1 row affected (0.16 sec) mysql> INSERT INTO DemoTable2 VALUES(42); Query OK, 1 row affected (0.17 sec)
Truy vấn đếm hàng của cả hai bảng cùng lúc:
mysql> SELECT
(SELECT COUNT(*) FROM DemoTable1) AS First_Table_Row,
(SELECT COUNT(*) FROM DemoTable2) AS Second_Table_Row;
Kết quả:
+-----------------+------------------+ | First_Table_Row | Second_Table_Row | +-----------------+------------------+ | 4 | 6 | +-----------------+------------------+ 1 row in set (0.00 sec)
Các phương pháp khác
1. UNION ALL (hiển thị theo hàng)
SELECT 'DemoTable1' AS TableName, COUNT(*) AS RowCount FROM DemoTable1 UNION ALL SELECT 'DemoTable2', COUNT(*) FROM DemoTable2;
+------------+----------+ | TableName | RowCount | +------------+----------+ | DemoTable1 | 4 | | DemoTable2 | 6 | +------------+----------+
2. information_schema.TABLES (nhanh, ước lượng)
SELECT TABLE_NAME, TABLE_ROWS
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME IN ('DemoTable1', 'DemoTable2');
Lưu ý: TABLE_ROWS là ước lượng cho InnoDB, chính xác cho MyISAM.
3. Stored Procedure động (nhiều bảng)
DELIMITER //
CREATE PROCEDURE CountAllTables()
BEGIN
SELECT TABLE_NAME, TABLE_ROWS
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = DATABASE();
END //
DELIMITER ;
So sánh
| Phương pháp | Độ chính xác | Hiệu suất | Phù hợp |
|---|---|---|---|
| Subquery COUNT(*) | Chính xác 100% | Chậm (full scan) | Ít bảng, cần chính xác |
| UNION ALL | Chính xác 100% | Chậm | Cần định dạng hàng |
| information_schema | Ước lượng (InnoDB) | Rất nhanh | Nhiều bảng, monitor |