Смешение явных и неявных объединений завершается с ошибкой: "Существует запись для таблицы... но на нее нельзя ссылаться из этой части запроса"
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
Вышеприведенный запрос при выполнении возвращает следующую ошибку.
ОШИБКА: неверная ссылка на запись FROM-clause для таблицы "i"
LINE 1:... te cory c LEFT JOIN photos p ON p.referencekey = i.key WHER...
СОВЕТ. Существует запись для таблицы "i", но на нее нельзя ссылаться из этой части запроса.
Ответы
Ответ 1
Так как ваш Items.Room = Rooms.Key, я бы просто получил это как где..
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
Ответ 2
Спецификация SQL указывает, что явные объединения выполняются перед неявным объединением. Это неявное соединение:
FROM table1 t1, table2 t2 WHERE t1.id=t2.t1id
Это явное соединение:
FROM table1 t1 JOIN table2 t2 ON (t1.id=t2.t1id)
Этот бит кода:
categories c
LEFT JOIN photos p
ON p.referencekey = i.key
является явным соединением и выполняется первым. Обратите внимание, что на данный момент таблица с псевдонимом, так как я еще не был просмотрен, поэтому он еще не может быть присоединен. Обратите внимание, что MySQL исправил это поведение в 5.2, я считаю, и этот запрос больше не будет работать там.
Ответ 3
Переместите оператор JOIN
рядом со следующей таблицей:
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
Длительное объяснение:
A JOIN
является частью выражения, которое приводит к исходной таблице, используемой в предложении FROM
как from_item. В вашем предложении FROM
есть 3 исходных таблицы from_item:
-
items
-
rooms
-
categories
соединен с photos
Ошибка находится в ON
join_condition вашего categories
, присоединенного к photos
from_item. Вы ссылаетесь на таблицу items
, которая не существует в файле from_item. Решение состоит в том, чтобы переместить объединение photos
в items
from_item, чтобы у вас были следующие исходные таблицы from_item:
-
items
, присоединенный к photos
-
rooms
-
categories
К сожалению, я не могу найти пример в документации, который очищает это отношение между таблицей в предложении FROM
и a JOIN
. SELECT
Синопсис показывает этот синтаксис и является лучшим источником в документации, чтобы найти это различие. Обратите внимание, что JOIN
не является предложением sibling для FROM
, но фактически является частью from_item в предложении FROM
. Таким образом, если ваш предложение FROM
состоит из списка таблиц, каждая таблица в этом списке может иметь свои собственные соединения. Затем становится более понятным, что каждая таблица, участвующая в соединении, должна быть включена в один элемент from_item.