2010-04-19 5 views
2

У меня есть SQL, который использовался для работы со старой версией MySQL, но после обновления до более новой версии MySQL 5 я получаю сообщение об ошибке. Вот SQL:Ошибка MySQL LEFT JOIN

SELECT portfolio.*, projects.*, types.* 
FROM projects, types 
LEFT JOIN portfolio 
ON portfolio.pfProjectID = projects.projectID 
WHERE projects.projectType = types.typeID AND types.typeID = #URL.a# 
ORDER BY types.typeSort, projects.projectPriority ASC 

и новая ошибка я получаю:

Unknown column 'projects.projectID' in 'on clause' 

Как я могу преобразовать это совместимый SQL для новой версии MySQL?

Большое спасибо!

+0

Познавательная: http://www.newtonslore.com/2008/10/08/mysql -unknown-column-in-on-clause-error/ –

ответ

2

Вам нужно переписать запрос, используя ВНУТРЕННИЙ РЕГИСТРИРУЙТЕСЬ вместо того, чтобы оператор запятой:

SELECT portfolio.*, projects.*, types.* 
FROM projects 
INNER JOIN types 
ON projects.projectType = types.typeID 
LEFT JOIN portfolio 
ON portfolio.pfProjectID = projects.projectID 
WHERE types.typeID = #URL.a# 
ORDER BY types.typeSort, projects.projectPriority ASC 

Пояснение:

Это связано с тем, что MySQL меняет приоритет оператора в соответствии со стандартами ANSI. Проверьте документацию MySQL: http://dev.mysql.com/doc/refman/5.1/en/join.html

INNER JOIN и, (запятая) являются семантически эквивалентны при отсутствии в условие соединения: как производят декартово произведение между указанных таблиц (то есть, каждый и каждая строка в первой таблице соединена с каждой строкой во второй таблице ).

Однако приоритет запятой Оператор меньше, чем INNER JOIN, ПЕРЕКРЕСТНАЯ ВСТУПЛЕНИЕ, ВЛЕВО ИСПОЛЬЗОВАНИЕ ВСПОМОГАТЕЛЬНОГО ИСПОЛЬЗОВАНИЯ. Если вы смешиваете запятую, а другие присоединяются к , то присоединяются типы, когда есть соединение Условие, ошибка формы Неизвестный столбец 'col_name' in 'on clause' может возникнуть. Информация о , посвященная этой проблеме, приведена ниже в этом разделе .

Существует также более подробное объяснение на MySQL странице поиска «Ранее оператор запятая (,)»

+0

Спасибо за помощь и включенные пояснения. – Alex

+0

Нет проблем. Просто для добавления это изменение было внесено в MySQL 5.0.12. – Janci

3

, как вы написали запрос, компилятор считает, что вы хотите присоединиться, оставленным portfolio к types, поэтому он жалуется, что ваша статья on ссылается на projects таблицы.

Попробуйте эту версию ANSI-стиль:

SELECT * 
FROM projects p 
inner join types t on p.projectType = t.typeID AND t.typeID = #URL.a# 
LEFT JOIN portfolio pf ON pf.pfProjectID = p.projectID 
ORDER BY t.typeSort, p.projectPriority 
+0

Спасибо, ребята, оба являются рабочими решениями. Очень признателен! – Alex

0

если ваш столбец ProjectID действительно существует, и нет опечатка, попытайтесь изменить это


SELECT portfolio.*, projects.*, types.* 
FROM projects 
INNER JOIN types ON projects.projectType = types.typeID 
LEFT JOIN portfolio 
ON portfolio.pfProjectID = projects.projectID 
WHERE types.typeID = #URL.a# 
ORDER BY types.typeSort, projects.projectPriority ASC 
+0

Спасибо, ребята, оба являются работающими решениями. Очень признателен! – Alex

+0

Хотя этот ответ разрешил проблему, он не объясняет, почему проблема возникла в первую очередь. Ниже представлен ответ Янчи, и именно поэтому я проигнорировал это и поддержал его. –

+0

Вы правы, и это имеет смысл. Я изменил индикатор, чтобы отметить этот пост. – Alex