MySQL LEFT JOIN ошибка - PullRequest
       10

MySQL LEFT JOIN ошибка

2 голосов
/ 19 апреля 2010

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

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?

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

Ответы [ 3 ]

3 голосов
/ 19 апреля 2010

Как вы написали запрос, компилятор считает, что вы хотите оставить присоединение 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
2 голосов
/ 19 апреля 2010

Вам нужно переписать запрос, используя INNER JOIN вместо запятой:

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 и, (запятая) семантически эквивалентный при отсутствии условия соединения: оба производят Декартово произведение между указанные таблицы (то есть каждая и каждая строка в первой таблице объединяется к каждому ряду во втором таблицу).

Однако приоритет запятой оператор меньше чем ВНУТРЕННЕЕ СОЕДИНЕНИЕ, CROSS JOIN, LEFT JOIN и так далее. Если Вы смешиваете запятые соединения с другим типы соединения, когда есть соединение условие, ошибка формы Неизвестный столбец 'col_name' в 'включен пункт "может возникнуть. Информация о решение этой проблемы дается далее в этом разделе.

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

0 голосов
/ 19 апреля 2010

, если ваш столбец 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
...