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