MySQL LEFT JOIN ошибка

У меня есть некоторый 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 ответа

Решение

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

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

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

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

Если ваш столбец 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
Другие вопросы по тегам