Le mélange explicite et implicite des jointures échoue avec " il y a une entrée pour table ... mais elle ne peut pas être référencée à partir de cette partie de la requête"
SELECT
i.*,
r.name AS roomname,
c.name AS cat,
p.key AS imgkey,
p.extension AS imgext
FROM
items i,
rooms r,
categories c
LEFT JOIN photos p
ON p.referencekey = i.key
WHERE
i.room = r.key
AND r.key = 663308
AND i.sitekey = 32201
AND c.key = i.categorykey
la requête ci-dessus, lorsqu'elle est exécutée, renvoie l'erreur suivante.
erreur: référence non valide à L'entrée "FROM-clause" pour la table "i"
ligne 1:...TEGORY c gauche joindre les photos p à la p. referencekey = I. key wer...
indice: il y a une entrée pour la table "i", mais elle ne peut pas être référencée à partir de cette partie de la requête.
3 réponses
Depuis vos Articles.Chambre = les Chambres.La clé, je voudrais juste que le "où"..
SELECT
i.*,
r.name AS roomname,
c.name AS cat,
p.key AS imgkey,
p.extension AS imgext
FROM
items i
LEFT JOIN photos p
ON p.referencekey = i.key
JOIN rooms r
on i.room = r.key
JOIN categories c
on i.categorykey = c.key
WHERE
i.sitekey = 32201
AND i.room = 663308
la spécification SQL stipule que les jointures explicites sont effectuées avant les jointures implicites. C'est une jointure implicite:
FROM table1 t1, table2 t2 WHERE t1.id=t2.t1id
Ceci est une jointure explicite:
FROM table1 t1 JOIN table2 t2 ON (t1.id=t2.t1id)
ce bit de code:
categories c
LEFT JOIN photos p
ON p.referencekey = i.key
est une jointure explicite et est lancé en premier. Notez qu'à ce point la table aliased car je n'ai pas encore été regardé, donc il ne peut pas être joint encore. Notez que MySQL a corrigé ce comportement en 5.2 je crois, et cette requête ne fonctionnera plus là non plus.
Déplacer JOIN
déclaration suivante à la table que vous rejoindre sur:
SELECT
i.*,
r.name AS roomname,
c.name AS cat,
p.key AS imgkey,
p.extension AS imgext
FROM
items i
LEFT JOIN photos p
ON p.referencekey = i.key,
rooms r,
categories c
WHERE
i.room = r.key
AND r.key = 663308
AND i.sitekey = 32201
AND c.key = i.categorykey
La longue explication:
JOIN
fait partie d'une expression qui aboutit à une table source, utilisée dans le FROM
clause from_item. Votre FROM
la clause a 3 from_item tableaux des sources:
items
rooms
categories
joint pourphotos
l'erreur est dans Le ON
join_condition de votre categories
joint photos
from_item. Vous faites référence à un tableau, items
, qui n'existe pas dans le from_item. La solution est de déplacer la photos
Rejoignez le items
from_item, de sorte que vous avez le suivant from_item tableaux des sources:
items
joint pourphotos
rooms
categories
malheureusement, je ne trouve pas d'exemple dans la documentation qui clarifie cette relation entre une table dans le FROM
clause JOIN
. SELECT
Synopsis montre cette syntaxe et est la meilleure source de la documentation pour trouver cette distinction. Notez qu'un JOIN
n'est pas une clause fraternelle à FROM
, mais fait partie d'un from_item dans le FROM
clause. Ainsi, si votre FROM
clause se compose d'une liste de tables, chaque table dans cette liste peut avoir ses propres jointures. Il devient alors plus intuitif que chaque table impliquée dans une jointure doit être incluse dans un seul from_item.