2009-12-14 6 views
2

J'ai une table de films et une table des votes. Les utilisateurs votent pour les films qu'ils aiment. J'ai besoin d'afficher la liste des films descendant sur le total des votes pour le film. Ce que j'ai maintenant fonctionne en quelque sorte. Le seul problème est qu'il ne montre pas de films avec 0 voix.mysql newbie - rejoindre

SELECT m.name, m.imdb_url, m.comment, COUNT(v.movie_id) AS votes 
FROM movies m, votes v 
WHERE v.movie_id=m.movie_id 
GROUP BY v.movie_id 
ORDER BY votes DESC 

Répondre

5

Vous devez faire une jointure externe; ce que vous avez codé est une jointure interne implicite.

Une jointure gauche gauche saisira toutes les lignes de la table "gauche" et tous les enregistrements correspondants de la table de droite. Toute table de gauche enregistrant des enregistrements correspondants manquants dans la table de droite aura une valeur nulle pour les valeurs de la table de droite. Vous pouvez transformer ces valeurs nulles en 0 de plusieurs façons.

0

Votre table a-t-elle la valeur 0 pour les vidéos sans vote ou utilise-t-elle NULL/EMPTY?

Si elle enregistre le zéro, faire quelque chose de votre SQL comme ceci:

« films SELECT WHERE votes> = 0 »

0

Vous avez probablement besoin de faire un left join, qui comprend des enregistrements dans la table de gauche (films) même s'il n'y a pas de correspondance dans la bonne table (votes).

0

Selon les conseils de peacedog:

SELECT m.name, m.imdb_url, m.comment, COUNT(v.movie_id) AS votes 

FROM movies m 
left outer join votes v 
on v.movie_id=m.movie_id 

GROUP BY v.movie_id 
ORDER BY COUNT(v.movie_id) DESC 

Je ne suis pas sûr de MySQL, mais pas toutes les bases de données vous permettent d'utiliser l'alias dans le bit ORDER BY, alors je l'ai remplacé votes avec COUNT(v.movie_id).

+0

Avec cela, il retourne un seul film qui a zéro voix. Je suppose que cela a quelque chose à voir avec le regroupement. – Fatalis

1

Ce que je crois que vous recherchez est un left join. Votre sql ressemblerait à ceci:

SELECT m.name, m.imdb_url, m.comment, COUNT(v.movie_id) AS votes 
FROM movies AS m 
LEFT JOIN votes AS v ON m.movie_id = v.movie_id 
GROUP BY v.movie_id 
ORDER BY votes DESC