O problema é que no mySQL o operador de vírgula tem menor precedência do que
join
operador, portanto, a product inner join (subquery) on part.id = highestcost.partid inner join (subquery) on part.id = lowestcost.partid
as junções são avaliadas antes a part
tabela é unida na expressão, daí a mensagem de erro. Substitua os operadores de vírgula por
join
simples operadores e mova as condições de junção de where
cláusula para on
cláusulas e tudo ficará bem:...
FROM vendor
inner join vendorparts on vendor.id = vendorparts.vendorid
inner join part on vendorparts.partid = part.id
inner join product on product.partid = part.id
INNER JOIN (SELECT vendorparts.partid,
Max(vendorparts.lastcost) AS Highestcost
FROM vendorparts
GROUP BY vendorparts.partid) AS highestcost
ON part.id = highestcost.partid
INNER JOIN (SELECT vendorparts.partid,
Min(vendorparts.lastcost) AS Lowestcost
FROM vendorparts
GROUP BY vendorparts.partid) AS lowestcost
ON part.id = lowestcost.partid
WHERE vendorparts.lastcost <> 0
Se você tiver mais consultas desse tipo onde você mistura operador de vírgula e junções explícitas, verifique-as porque elas podem produzir resultados diferentes, mesmo que não haja erro de sintaxe no MySQL.