La limitation d'un left join pour retourner un résultat?
J'ai actuellement cette jointure gauche dans le cadre d'une requête:
LEFT JOIN movies t3 ON t1.movie_id = t3.movie_id AND t3.popularity = 0
Le problème, c'est que si il y a plusieurs films avec le même nom et la même popularité (ne me demandez pas, il est juste de cette façon : -)), puis les résultats sont renvoyés.
Tout ça pour dire, je voudrais limiter le résultat de la jointure gauche à un.
J'ai essayé ceci:
LEFT JOIN
(SELECT t3.movie_name FROM movies t3 WHERE t3.popularity = 0 LIMIT 1)
ON t1.movie_id = t3.movie_id AND t3.popularity = 0
La deuxième requête meurt avec l'erreur:
Every derived table must have its own alias
Je sais ce que je demande est un peu vague car je ne suis pas la question, mais est ce que je demande généralement possible?
c'est la dernière jointure gauche, à droite? vous n'allez pas
Jetez un oeil à la
c'est la dernière
Avez-vous essayé
LEFT JOIN ... ON ... AND ... LEFT JOIN ...
êtes-vous? et est LIMIT 1
à la fin de votre déclaration qui n'est pas ce que vous cherchez?Jetez un oeil à la
DISTINCT
déclaration, peut-être résoudre votre problème.c'est la dernière
LEFT JOIN
dans la requête, oui. Il y a deux autres avant elle. Je ne peux pas simplement s'en tenir LIMIT 1
à la fin, cependant, parce que la requête dans son ensemble renvoie le nombre de lignes.Avez-vous essayé
LIMIT 0, 1
?
OriginalL'auteur Nate | 2012-07-09
Vous devez vous connecter pour publier un commentaire.
L'erreur est claire: il vous suffit de créer un alias pour la sous-requête suite de la fermeture de
)
et à utiliser dans votreON
clause puisque chaque table, dérivé ou réel, doit avoir son propre identifiant. Ensuite, vous aurez besoin d'incluremovie_id
dans la sous-requête select de la liste pour être en mesure de se joindre à elle. Depuis la sous-requête contient déjàWHERE popularity = 0
, vous n'avez pas besoin de l'inclure dans la jointure duON
clause.Si vous utilisez l'une de ces colonnes à l'extérieur
SELECT
, référence viathe_alias.movie_name
par exemple.Mise à jour après la compréhension de l'exigence de mieux:
D'en obtenir un par de joindre le groupe de contre, vous pouvez utiliser un agrégat
MAX()
ouMIN()
sur lemovie_id
et un groupe dans la sous-requête. Pas de sous-requêteLIMIT
est alors nécessaire -- vous recevrez la premièremovie_id
par nom avecMIN()
ou le dernier avecMAX()
.LIMIT 1
de l'instruction, puis il retourne plusieurs résultats (film de noms) comme avant, mais si je laisseLIMIT 1
dans la requête no movie noms sont retournés. Aucune idée de pourquoi cela serait? Merci encore.C'est un peu bizarre. J'ai mis dans une explicite
ORDER BY
(qui devrait avoir été là), mais je ne pense pas que ce soit la raison.Exécutez la sous-requête par lui-même et de vérifier qu'il renvoie la ligne correcte avec la clause where vous avez.
et quelle est votre version de MySQL? Les versions plus anciennes n'ont pas de soutien
LIMIT
dans les sous-requêtes, si elle fonctionne depuis 5.0 au moins.Je vois ce qui se passe. Elle retourne le nom du film (dans mon exemple) pour la première ligne de la table, non pas pour de l'animation actuelle. I. e. si j'ajoute
AND movie_id = 2
aprèsWHERE popularity = 0
puis il renvoie le nom du film pour que id. J'ai essayé d'ajouterAND movie_id = t1.movie_id
, mais qui meurt avec l'erreurUnknown column 't1.movie_id' in 'where clause'
. Hmm..OriginalL'auteur Michael Berkowski
vous pourriez essayer d'ajouter
GROUP BY t3.movie_id
à la première requêteOriginalL'auteur i--
Essayez ceci:
OriginalL'auteur Preet Sangha