GROUP BY กรองตาม Company แล้วจัดกลุ่ม Employee
ใช้ WHERE กรอง Company ก่อน แล้ว GROUP BY EmployeeName เพื่อหา Unique Names
ตัวอย่าง
CREATE TABLE DemoTable642 (
EmployeeId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
EmployeeName VARCHAR(100),
EmployeeCompanyName VARCHAR(100)
);
INSERT INTO DemoTable642(EmployeeName, EmployeeCompanyName) VALUES
('John', 'Google'), ('Carol', 'Microsoft'), ('John', 'Amazon'),
('Carol', 'Google'), ('John', 'Flipkart');
Query: ชื่อพนักงานในบริษัท Google (Unique)
SELECT EmployeeName
FROM DemoTable642
WHERE EmployeeCompanyName = 'Google'
GROUP BY EmployeeName;
ผลลัพธ์: John, Carol
+--------------+
| EmployeeName |
+--------------+
| John |
| Carol |
+--------------+
GROUP BY Behavior (MySQL 5.7+ ONLY_FULL_GROUP_BY)
- Default ON: SELECT Column ต้องอยู่ใน GROUP BY หรือเป็น Aggregate Function
- Query ข้างบน OK เพราะ SELECT เฉพาะ EmployeeName ที่อยู่ใน GROUP BY
- ถ้า SELECT EmployeeCompanyName ด้วย ต้อง ADD ใน GROUP BY หรือใช้ ANY_VALUE()
ตัวอย่างเพิ่มเติม: นับจำนวนพนักงานต่อบริษัท
SELECT EmployeeCompanyName, COUNT(*) AS employee_count
FROM DemoTable642
GROUP BY EmployeeCompanyName
ORDER BY employee_count DESC;
ผลลัพธ์:
+---------------------+----------------+
| EmployeeCompanyName | employee_count |
+---------------------+----------------+
| Google | 2 |
| Microsoft | 1 |
| Amazon | 1 |
| Flipkart | 1 |
+---------------------+----------------+
ตัวอย่าง: พนักงานที่ทำงานหลายบริษัท (Multiple Companies)
SELECT EmployeeName, COUNT(DISTINCT EmployeeCompanyName) AS company_count
FROM DemoTable642
GROUP BY EmployeeName
HAVING company_count > 1;
ผลลัพธ์: John (3 บริษัท), Carol (2 บริษัท)
Window Function Alternative (MySQL 8.0+)
SELECT DISTINCT EmployeeName
FROM (
SELECT EmployeeName,
ROW_NUMBER() OVER (PARTITION BY EmployeeName ORDER BY EmployeeId) AS rn
FROM DemoTable642
WHERE EmployeeCompanyName = 'Google'
) t WHERE rn = 1;
Index แนะนำ
CREATE INDEX idx_company_name ON DemoTable642(EmployeeCompanyName, EmployeeName);