Bạn đang thiếu một điều kiện kết hợp giữa candidates
và jobs
, vì vậy bạn sẽ có được một sản phẩm cacte giữa cả hai bảng. Ngoài ra, có vấn đề với điều kiện tham gia trên skill_names
, trong đó cả hai cột đều giống nhau (điều này một lần nữa tạo ra một sản phẩm cacte).
SELECT can.* , co.*, j.*, sn.*
FROM candidates AS can
JOIN jobs AS j ON j.candidate_id = can.candidate_id --> here: missing join condition
JOIN companies AS co ON j.company_id = co.company_id
JOIN skills AS s ON s.job_id = j.job_id
JOIN skill_names AS sn ON sn.skill_id = s.skill_id --> and here: wrong join condition
Nhiều RDBMS sẽ phát sinh lỗi cú pháp trên JOIN
không có ON
mệnh đề (nếu bạn muốn có một sản phẩm của cartesian, bạn cần phải nói rõ về nó bằng cách sử dụng CROSS JOIN
), nhưng, than ôi, không phải MySQL.
Khi nói đến câu hỏi này:
Không. Miễn là bạn đang sử dụng inner join
s (không phải left join
s), thứ tự kết hợp không quan trọng đối với trình lập kế hoạch truy vấn, điều này sẽ sắp xếp lại chúng theo thứ tự mà nó cho là hiệu quả hơn.