ใช้ Subquery ใน SELECT เพื่อนับจำนวนครั้งของค่าในแต่ละแถว
ตัวอย่างการใช้งาน
1. สร้างตารางและข้อมูล
mysql> CREATE TABLE DemoTable (Value INT); mysql> INSERT INTO DemoTable VALUES (20), (30), (20), (40), (30), (20);
2. Query นับ Occurrence ต่อแถว
mysql> SELECT tbl.Value,
-> (SELECT COUNT(*) FROM DemoTable WHERE Value = tbl.Value) AS Occurrence
-> FROM DemoTable tbl;
ผลลัพธ์
+-------+------------+ | Value | Occurrence | +-------+------------+ | 20 | 3 | | 30 | 2 | | 20 | 3 | | 40 | 1 | | 30 | 2 | | 20 | 3 | +-------+------------+
วิธีที่มีประสิทธิภาพมากกว่า (JOIN / Window Function)
1. ใช้ JOIN กับ Subquery รวม
SELECT d.Value, c.cnt AS Occurrence FROM DemoTable d JOIN (SELECT Value, COUNT(*) AS cnt FROM DemoTable GROUP BY Value) c ON d.Value = c.Value;
2. MySQL 8.0+: Window Function
SELECT Value, COUNT(*) OVER (PARTITION BY Value) AS Occurrence FROM DemoTable;
เปรียบเทียบประสิทธิภาพ
| วิธี | Complexity | MySQL Version | หมายเหตุ |
|---|---|---|---|
| Correlated Subquery | O(n²) | All | ช้า ข้อมูลเยอะ |
| JOIN + GROUP BY | O(n log n) | All | แนะนำทั่วไป |
| Window Function | O(n log n) | 8.0+ | สะดวก อ่านง่าย |