Uma
left join
está correto, mas você precisa dos types
ser o primeiro:SELECT DISTINCT types.type, owners.name, owners.city
FROM tbl_pet_types types LEFT JOIN
tbl_pet_owners owners
ON owners.pet = types.pet
WHERE types.type IN ('mammal', 'fish', 'amphibian', 'seacreature');
Porque o
WHERE
cláusula refere-se apenas a tbl_pet_types
, não muda. Como a
left join
funciona é simples:mantém todas as linhas no primeiro tabela. Colunas sem correspondência no segundo tornam-se NULL
. EDITAR:
Se você tiver uma lista de tipos que não estão em
tbl_pet_types
, então você precisa de uma left join
com todos os valores em uma tabela derivada:SELECT DISTINCT tt.type, po.name, po.city
FROM (SELECT 'mammal' as type UNION ALL
SELECT 'fish' as type UNION ALL
SELECT 'amphibian' as type UNION ALL
SELECT 'seacreature' as type
) tt left join
tbl_pet_types pt
ON pt.type = tt.type LEFT JOIN
tbl_pet_owners po
ON po.pet = pt.pet;