Ajuda com LEFT JOIN
Posted by:
wgi samuek
Date: December 26, 2011 10:18PM
Boas,
Estou neste momento a trabalhar num projecto com Django usando MySQL. O meu primeiro problema foi:
(De forma semi-abstracta)
mydatabase_votecontext
(id, name)
(1, Flavour)
(2, Smell)
(3, Usability)
(4, Size)
mydatabase_vote
(id, thing, context, user, vote)
(1, Potatoes, Flavour, Me, 2.0)
(2, Potatoes, Smell, Me, 4.3)
(3, Potatoes, Usability, Me, 4.0)
(4, Carrots, Flavor, Me, 3.0)
(5, Cars, Smell, Me, 4.2)
(6, Cars, Usability, Me, 4.9)
queria que, ao fazer um query por uma "thing" especifica, o resultado fosse:
(Carrots, Flavour, 2.0)
(Carrots, Smell, 0.0)
(Carrots, Usability, 0.0)
(Carrots, Size, 0.0)
Ou seja, aparecerem também os Context mesmo quando não houve um voto feito para "essa coisa nesse contexto".
Entretanto consegui isso através de uma sugestão que me foi feita: usando um LEFT JOIN:
SELECT mb.id, mb.name, COALESCE( AVG( vote ) , 0.0 )
FROM mydatabase_votecontext AS md
LEFT JOIN mydatabase_vote ON ( mydatabase_vote.context_id = md.id
AND thing_id = 1)
GROUP BY thing_id, name
ORDER BY md.id
Agora o meu problema ficou mais complexo. Tenho também:
mydatabase_user
(id, ......)
mydatabase_facebookuser)
(id, user_id, gender, ...)
E queria fazer uma média de votos, como já está, mas a filtrar por gender !
Ora eu não estou a conseguir fazer isso sem o resultado retornar sem as linhas respectivas aos contextos em que não houve votos.
Ou seja, se os votos tivessem sido:
(5, Cars, Smell, Me, 4.2) // Utilizador do sexo masculino
(6, Cars, Usability, Me, 4.9) // Utilizador do sexo masculino
O resultado seria
(Cars, Smell, 4.2 )
(Carrots, Usability, 4.9)
em vez de
(Cars, Flavour, 0.0)
(Cars, Smell, 4.2 )
(Carrots, Usability, 4.9)
(Carrots, Size, 0.0)
Agradeço toda a ajuda que me possam dar pois não tenho grande experiência na utilização de JOINs e não tenho conseguido encontrar a solução por mais maneiras que tenha experimentado.