J'ai une table appelée galerie. Pour chaque ligne galerie il y a plusieurs lignes dans le tableau image. Une photo appartient à une galerie. Ensuite, il y a le tableau vote. Chaque rangée est une upvote ou une downvote pour une certaine galerie. Voici la structure (simplifiée):Agrégation avec deux jointures (MySQL)
gallery (gallery_id)
picture (picture_id, picture_gallery_ref)
vote (vote_id, vote_value, vote_gallery_ref)
Maintenant, je veux une requête pour me donner les informations suivantes: Toutes les galeries avec leurs propres champs de données et le nombre d'images qui sont connectés à la galerie et la valeur sumarized des votes.
Voici ma requête, mais en raison de la jointure multiple, les valeurs agrégées ne sont pas les bonnes. (Au moins quand il y a plus d'une ligne de soit des images ou des votes.)
SELECT
*, SUM(vote_value) as score, COUNT(picture_id) AS pictures
FROM
gallery
LEFT JOIN
vote
ON gallery_id = vote_gallery_ref
LEFT JOIN
picture
ON gallery_id = picture_gallery_ref
GROUP BY gallery_id
Parce que je l'ai remarqué que COUNT(DISTINCT picture_id)
me donne le bon nombre de photos que j'ai essayé ceci:
(SUM(vote_value)/GREATEST(COUNT(DISTINCT picture_id), 1)) AS score
Il fonctionne dans cet exemple, mais que se passerait-il s'il y avait plus de jointures dans une requête? Je veux juste savoir s'il y a une meilleure ou plus «élégante» façon de résoudre ce problème. Aussi, j'aimerais savoir si ma solution est spécifique à MySQL ou SQL standard?
votre GROUP BY utilise une colonne que vous n'avez pas définie, je suppose que vous vouliez dire gallery_id. – sfossen
Oui, petite erreur – okoman