Để kết thúc seri bài viết lên quan tới JOIN thì hôm nay trong bài viết này, bạn sẽ học cách sử dụng MySQL Self Join để nối một bảng với chính nó bằng phép nối bên trong hoặc nối trái.
Trong các bài viết trước, bạn đã học cách nối một bảng với các bảng khác bằng mệnh đề INNER JOIN, LEFT JOIN, RIGHT JOINhoặc CROSS JOIN. Tuy nhiên, có một trường hợp đặc biệt mà bạn cần nối một bảng với chính nó, trường hợp này được gọi là tự nối.
Self Join thường được sử dụng để truy vấn dữ liệu phân cấp hoặc để so sánh một hàng với các hàng khác trong cùng một bảng.
Để thực hiện tự nối, bạn phải sử dụng alias để không lặp lại cùng một tên bảng hai lần trong một truy vấn. Lưu ý rằng việc tham chiếu một bảng hai lần trở lên trong truy vấn mà không sử dụng bí danh bảng sẽ gây ra lỗi.
Trong các hướng dẫn trước, bạn đã học cách nối một bảng với các bảng khác bằng mệnh đề INNER JOIN, LEFT JOIN, RIGHT JOINhoặc CROSS JOIN. Tuy nhiên, có một trường hợp đặc biệt mà bạn cần nối một bảng với chính nó, trường hợp này được gọi là tự nối.
Tự nối thường được sử dụng để truy vấn dữ liệu phân cấp hoặc để so sánh một hàng với các hàng khác trong cùng một bảng.
Để thực hiện tự nối, bạn phải sử dụng bí danh bảng để không lặp lại cùng một tên bảng hai lần trong một truy vấn. Lưu ý rằng việc tham chiếu một bảng hai lần trở lên trong truy vấn mà không sử dụng bí danh bảng sẽ gây ra lỗi.
Hãy xem bảng employees trong cơ sở dữ liệu mẫu .

Bảng employees không chỉ lưu trữ dữ liệu nhân viên mà còn cả dữ liệu cấu trúc tổ chức. Cột reportsto được sử dụng để xác định id người quản lý của một nhân viên.
Để có được toàn bộ cấu trúc tổ chức, bạn có thể nối bảng employees với chính nó bằng cách sử dụng các cột employeeNumber và reportsTo. Bảng employees có hai vai trò: một là Người quản lý và vai trò còn lại là Báo cáo trực tiếp.
SELECT
CONCAT(m.lastName, ', ', m.firstName) AS Manager,
CONCAT(e.lastName, ', ', e.firstName) AS 'Direct report'
FROM
employees e
INNER JOIN employees m ON
m.employeeNumber = e.reportsTo
ORDER BY
Manager;Kết quả:

Kết quả chỉ hiển thị những nhân viên có người quản lý. Tuy nhiên, bạn không nhìn thấy President vì tên của ông ấy bị lọc ra do điều kiện INNER JOIN.
President là nhân viên không có bất kỳ người quản lý hoặc giá trị trong cột reportsTo là NULL.
Câu lệnh dưới đây sử dụng mệnh đề LEFT JOIN thay vì INNER JOIN để bao gồm President:
SELECT
IFNULL(CONCAT(m.lastname, ', ', m.firstname),
'Top Manager') AS 'Manager',
CONCAT(e.lastname, ', ', e.firstname) AS 'Direct report'
FROM
employees e
LEFT JOIN employees m ON
m.employeeNumber = e.reportsto
ORDER BY
manager DESC;Kết quả:

Bằng cách sử dụng MySQL SELF JOIN, bạn có thể hiển thị danh sách khách hàng ở cùng một thành phố bằng cách JOIN bảng customers với chính nó.
SELECT
c1.city,
c1.customerName,
c2.customerName
FROM
customers c1
INNER JOIN customers c2 ON
c1.city = c2.city
AND c1.customername > c2.customerName
ORDER BY
c1.city;Kết quả:

Trong ví dụ này, bảng customers được nối với chính nó bằng các điều kiện nối sau:
c1.city = c2.city đảm bảo rằng cả hai khách hàng đều có cùng một thành phố.c.customerName > c2.customerName đảm bảo rằng không có cùng một khách hàng được bao gồm.Trong hướng dẫn này, bạn đã học cách MySQL tự nối bảng đó để nối một bảng với chính nó bằng cách sử dụng mệnh đề INNER JOINhoặc LEFT JOIN.
Bàn có thể xem chi tiết tại: https://www.mysqltutorial.org/mysql-self-join/
Các bài viết liên quan:
Bình luận: