U mist een deelnamevoorwaarde tussen candidates
en jobs
, dus je krijgt een cartesiaans product tussen beide tafels. Er is ook een probleem met de deelnamevoorwaarde op skill_names
, waarbij beide kolommen hetzelfde zijn (dit genereert opnieuw een cartesiaans product).
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
Veel RDBMS zouden een syntaxisfout veroorzaken op een JOIN
zonder een ON
clausule (als je een cartesiaans product wilt, moet je daar expliciet over zijn door CROSS JOIN
te gebruiken ), maar helaas niet MySQL.
Als het op deze vraag aankomt:
Nee. Zolang je inner join
gebruikt s (niet left join
s), maakt de samenvoegvolgorde niet uit voor de queryplanner, die ze zal herschikken in de volgorde die hij denkt dat het meest efficiënt is.