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

MySQL: นับจำนวนแถวจาก 2 ตารางในคิวรี่เดียวด้วย Subquery และ DUAL


คำอธิบาย

ใช้ Subquery ใน SELECT clause นับ COUNT(*) จากแต่ละตาราง แล้ว SELECT จาก DUAL (Dummy table) เพื่อให้ได้ 1 แถวเดียว

ขั้นตอนการสร้างตารางและข้อมูลตัวอย่าง

ตารางที่ 1: DemoTable1

mysql> create table DemoTable1 ( Name varchar(40) ); 
Query OK, 0 rows affected (0.81 sec)
mysql> insert into DemoTable1 values('Chris'); 
Query OK, 1 row affected (0.48 sec)
mysql> insert into DemoTable1 values('Robert'); 
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable1 values('Mike'); 
Query OK, 1 row affected (0.10 sec)

ตารางที่ 2: DemoTable2

mysql> create table DemoTable2 ( Score int ); 
Query OK, 0 rows affected (1.16 sec)
mysql> insert into DemoTable2 values(86); 
Query OK, 1 row affected (0.22 sec)
mysql> insert into DemoTable2 values(98); 
Query OK, 1 row affected (0.08 sec)
mysql> insert into DemoTable2 values(75); 
Query OK, 1 row affected (0.14 sec)

คิวรี่นับแถวจาก 2 ตารางพร้อมกัน

mysql> select 
    (select count(*) from DemoTable1) AS FirstTableCount, 
    (select count(*) from DemoTable2) AS SecondTableCount 
from dual;

ผลลัพธ์

+-----------------+------------------+
| FirstTableCount | SecondTableCount |
+-----------------+------------------+
| 3               | 3                |
+-----------------+------------------+
1 row in set (0.00 sec)

คำอธิบาย

  • DUAL: ตาราง Dummy ใน MySQL (และ Oracle) ใช้เมื่อต้องการ SELECT ค่าคงที่หรือ Expression โดยไม่ต้อง FROM ตารางจริง
  • Subquery แต่ละอันทำงานอิสระ คืนค่า Scalar (ค่าเดียว)
  • Alias FirstTableCount, SecondTableCount ตั้งชื่อคอลัมน์ผลลัพธ์

วิธีอื่น: UNION ALL

SELECT 'DemoTable1' as TableName, COUNT(*) as RowCount FROM DemoTable1
UNION ALL
SELECT 'DemoTable2', COUNT(*) FROM DemoTable2;

ผลลัพธ์เป็น 2 แถว (TableName, RowCount)

ประสิทธิภาพ

COUNT(*) บน InnoDB ต้อง Scan ทุกแถว (MVCC) หากต้องการนับเร็ว ให้เก็บจำนวนไว้ในตารางสรุป (Summary Table) หรือใช้ Trigger อัปเดต