JOINTURE GAUCHE après le GROUPE?
J'ai une table de "Chansons", "Songs_Tags" (concernant les chansons avec les étiquettes) et "Songs_Votes" (concernant les chansons avec l'opérateur booléen aime/aime pas).
J'ai besoin de récupérer les chansons avec un GROUP_CONCAT() de ses balises et aussi le nombre de "j'aime" (vrai) et n'aime pas (false).
Ma requête est quelque chose comme ça:
SELECT
s.*,
GROUP_CONCAT(st.id_tag) AS tags_ids,
COUNT(CASE WHEN v.vote=1 THEN 1 ELSE NULL END) as votesUp,
COUNT(CASE WHEN v.vote=0 THEN 1 ELSE NULL END) as votesDown,
FROM Songs s
LEFT JOIN Songs_Tags st ON (s.id = st.id_song)
LEFT JOIN Votes v ON (s.id=v.id_song)
GROUP BY s.id
ORDER BY id DESC
Le problème est que quand une Chanson a plus de 1 tag, il revient plus d'une fois, donc quand je fais le COUNT(), elle renvoie plus de résultats.
La meilleure solution je pense est de savoir si il serait possible de faire la dernière JOINTURE GAUCHE après le GROUP BY (alors maintenant, il n'y aurait qu'une seule entrée pour chaque chanson). Alors j'avais besoin d'un autre GROUPE PAR m.id.
Est-il un moyen de le réaliser? Ai-je besoin d'utiliser une sous-requête?
oui, (id_song, id_vote)
OriginalL'auteur Lem0n | 2012-02-22
Vous devez vous connecter pour publier un commentaire.
Il y a eu quelques bonnes réponses jusqu'à présent, mais je voudrais adopter une méthode légèrement différente tout à fait semblable à ce que vous avez décrit à l'origine
En ce que la sous-requête est responsable pour la collecte des chansons avec des balises dans un 1 ligne par chanson. C'est ensuite rejoint sur les Votes par la suite. J'ai aussi choisi de simplement résumer la v. votes colonne comme vous l'avez indiqué, il est 1 ou 0, et donc à une SOMME(v. votes) ajouter jusqu'1+1+1+0+0 = 3 de 5 sont upvotes, tandis que la SOMME(1-v. vote) somme 0+0+0+1+1 = 2 de 5 sont downvotes.
Si vous aviez un index sur les votes avec les colonnes (id_song,voix), alors que l'indice devrait être utilisé pour cela donc il ne serait même pas frapper la table. De même, si vous avez eu un index sur Songs_Tags avec (id_song,id_tag) alors que le tableau ne serait pas touché par la requête.
modifier ajoutée de la solution à l'aide de count
Il fonctionne avec deux, ajouté dans votre COUNT() option
OriginalL'auteur Simon at My School Portal
Essayez ceci:
En fait, il n'est pas le résoudre. Si plus de gens vote "j'aime" (vrai), il sera considéré comme plus d'UN comme.
Lem0n: Il a travaillé au cours de mes tests, mais j'ai peut-être légèrement différentes structures de données pour vous. Noter que le nombre est de id_vote, pas de 1...
ah, ça fait du sens. mais id_vote est en fait juste un booléen (true/false (ouais, mauvais nom). peut-être que je pouvais COMPTER de la rangée complète comme (id_song, id_user, vote)?
OriginalL'auteur My Other Me
Votre code dans un mini-produit Cartésien parce que vous êtes à faire des Jointures dans
1-to-many
les relations et la1
table est sur le même côté de deux jointures.Convertir à 2 sous-requêtes avec les groupements et ensuite Rejoindre:
Aurez-vous confiance en moi si je dis que c'est plus rapide? Test (toutes les requêtes qui donnent des résultats corrects) avec vos données et de la distribution, de votre serveur et de ses paramètres, avec les différentes dimensions de la table et puis de choisir 🙂
OriginalL'auteur ypercubeᵀᴹ