Странно: MySQL Left Join, «неизвестный столбец»; то же самое левое соединение не работает в запросе с несколькими таблицами

#mysql #sql #database #left-join

#mysql #sql #База данных #соединение по левой стороне

Вопрос:

Я пытаюсь выполнить запрос select, который является следующим:

 SELECT * FROM pages, c_item_category cc
LEFT JOIN pages_tr ON (pages.page_id = pages_tr.page_id AND lang_id = 2)
LEFT JOIN users ON (pages.page_author = users.u_id)
WHERE (pages.page_id = cc.item_id AND cc.cat_id = 7)
  AND (page_date >= 1317420000 AND page_date <= 1320101999)
  AND (page_showinfos = 1)
ORDER BY page_date ASC LIMIT 0,10
  

Но я получаю эту ошибку: неизвестный столбец ‘pages.page_id’ в предложении ‘on’

Почему это? Я могу подтвердить, что у меня есть столбец с именем ‘page_id’ в ‘pages’ 🙂

Но, когда я выполняю запрос с одной таблицей с теми же левыми соединениями, это работает хорошо:

 SELECT * FROM pages
LEFT JOIN pages_tr ON (pages.page_id = pages_tr.page_id AND lang_id = 2)
LEFT JOIN users ON (pages.page_author = users.u_id)
WHERE (page_date >= 1317420000 AND page_date <= 1320101999)
  AND (page_showinfos = 1)
ORDER BY page_date ASC LIMIT 0,10
  

В чем моя ошибка в первом запросе? :

Комментарии:

1. Вы пытаетесь объединить неявное соединение и явное объединение. Я не знаю, поддерживает ли MySQL это, но я бы переписал это как одно или другое.

2. MySQL поддерживает это, но явное СОЕДИНЕНИЕ ПО ЛЕВОМУ краю имеет более высокий приоритет, чем запятая, поэтому MySQL соединяет только cc с pages_tr , а не перекрестное соединение pages и cc . Так что на самом деле pages это само по себе неизвестное имя для этой части запроса, а не только для page_id столбца. Действительно, вам следует переписать его, чтобы использовать стандартное JOIN вместо WHERE псевдо-соединения.

Ответ №1:

Попробуйте вместо этого этот способ.

 SELECT *
FROM pages
LEFT JOIN pages_tr ON (pages.page_id = pages_tr.page_id AND lang_id = 2)
LEFT JOIN users ON (pages.page_author = users.u_id),
c_item_category cc
WHERE (pages.page_id = cc.item_id AND cc.cat_id = 7)
  AND (page_date >= 1317420000 AND page_date <= 1320101999)
  AND (page_showinfos = 1)
ORDER BY page_date ASC LIMIT 0,10
  

Комментарии:

1. Спасибо, должен был знать это 🙂