Segue minha tabela:
filmes_franquias:
movie_id franchise_id
1 10
2 11
3 10
4 15
1 11
O que eu quero: obter todos os movie_id com o mesmo franchise_id do meu filme de destino (movie_id - 1 por exemplo), exceto o filme de destino. Como você pode entender, esta é uma consulta gentil para obter filmes semelhantes com base na franquia do filme selecionado.
Eu tentei:
SELECT movie_id
FROM movies_franchises
WHERE franchise_id = ( SELECT franchise_id
FROM movies_franchises
WHERE movie_id = @target_movie_id)
AND movie_id != @target_movie_id;
Mas não acho que isso seja uma boa prática. Além disso, esta consulta não funcionará se select subquery
tiver mais de um resultado (se o filme tiver mais de 1 franquia).
Portanto, neste caso, se eu quiser obter filmes semelhantes para filmes com movie_id = 1, devem ser todos os filmes de 10 E 11 franquias.
Se a subconsulta puder retornar vários resultados, você deverá usar
IN
em vez de=
. É bom adquirir o hábito de qualificar totalmente de qual tabela uma coluna está vindo:Você também pode simplesmente fazer uma junção simples.
Isso não requer nada mais (como
distinct
) já que `(franchise_id, movie_id) já é único.Com relação a "Mas eu não acho que isso seja uma boa prática", esse tipo de consulta quando você quer uma semijoin é bom - você só quer colunas de uma das fontes de linha, então você realmente não precisa fazer isso como uma junção. Em termos de desempenho, não há regra sobre qual é melhor, e há todas as chances de que ambos usem o mesmo plano de execução para realizar. Isso não quer dizer que você não encontrará conselhos (muito confiantes) dizendo que você só deve fazer isso de uma maneira específica. A melhor consulta se torna aquela que é mais fácil de ler e manter (que é o que seu chefe decidir ;) ).