Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Áp dụng CROSS JOIN đúng cách trong MySQL

Tóm tắt

CROSS JOIN tạo tích Descartes (mọi cặp hàng từ 2 tập). Bài viết示范 tìm các cặp (UserName, UserRelationshipName) **chưa tồn tại** trong bảng.

Ví dụ

1. Tạo bảng

CREATE TABLE PairDemo (
    UserId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    UserName VARCHAR(20),
    UserRelationshipName VARCHAR(20)
);

2. Dữ liệu

INSERT INTO PairDemo (UserName, UserRelationshipName) VALUES
('John', 'James'), ('Carol', 'James'), ('Carol', 'David'), ('Sam', 'David');

3. CROSS JOIN + NOT EXISTS

SELECT U.UserName, UR.UserRelationshipName
FROM (
    (SELECT DISTINCT UserName FROM PairDemo) U
    CROSS JOIN
    (SELECT DISTINCT UserRelationshipName FROM PairDemo) UR
)
WHERE NOT EXISTS (
    SELECT * FROM PairDemo T
    WHERE T.UserName = U.UserName
      AND T.UserRelationshipName = UR.UserRelationshipName
);

4. Kết quả: Các cặp chưa có

+----------+----------------------+
| UserName | UserRelationshipName |
+----------+----------------------+
| Sam      | James                |
| John     | David                |
+----------+----------------------+

Giải thích

  1. Subquery U: danh sách tên duy nhất (John, Carol, Sam).
  2. Subquery UR: danh sách relationship duy nhất (James, David).
  3. CROSS JOIN → 3×2 = 6 cặp có thể.
  4. NOT EXISTS loại 4 cặp đã có trong bảng → còn 2 cặp thiếu.

Lưu ý hiệu năng

  • CROSS JOIN tạo N×M hàng – cẩn thận với tập lớn.
  • Dùng index trên (UserName, UserRelationshipName) để NOT EXISTS nhanh.
  • Thay thế: LEFT JOIN ... WHERE T.id IS NULL (anti-join) thường nhanh hơn NOT EXISTS.