MySQL SELF JOIN được sử dụng như thế nào ?

29/05/2023 - lượt xem
Chia sẻ
 
Rate this post

Để 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 JOINRIGHT 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.

Giới thiệu về mệnh đề MySQL SELF JOIN

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 JOINRIGHT 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.

Ví dụ về  MySQL SELF JOIN

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.

1) MySQL SELF JOIN sử dụng mệnh đề INNER JOIN

Để 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.

2) Sử dụng MySQL SELF JOIN với mệnh đề LEFT 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ả:

3) Sử dụng MySQL SELF JOIN để so sánh các hàng liên tiếp

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.

Tổng kết

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:

    Liên hệ với chúng tôi

    Để lại thông tin để nhận được các bài viết khác

    Rate this post

    Xem thêm nhiều bài tin mới nhất về Kiến thức

    Xem thêm