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

MySQL GROUP BY ดึงชื่อพนักงานจากบริษัทเฉพาะ

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);