#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. Спасибо, должен был знать это 🙂