Не смесвайте SQL-89 синтаксис на присъединяване в стил „запетая“ с SQL-92 JOIN
синтаксис. Има фини проблеми с предимството на тези два типа операции за свързване.
Във вашия случай последствието е, че оценява условието за присъединяване LEFT JOIN
преди u
съществува псевдоним на таблицата. Ето защо то не знае какво u.usr_auto_key
е.
Можете да коригирате този проблем, като използвате JOIN
синтаксис за всички съединения:
SELECT
`u`.`usr_auto_key` AS `u__usr_auto_key`,
`s`.`set_auto_key` AS `s__set_auto_key`,
`u2`.`usr_auto_key` AS `u2__usr_auto_key`,
`u2`.`set_auto_key` AS `u2__set_auto_key`,
`u2`.`value` AS `u2__value`
FROM `User` `u` JOIN `Setting` `s`
LEFT JOIN `User_Setting` `u2` ON `u`.`usr_auto_key` = `u2`.`usr_auto_key`
WHERE (`s`.`sct_auto_key` = 1 AND `u`.`usr_auto_key` = 1 AND admin_property is null)
Не видях никакво условие за присъединяване между u
и s
във вашето запитване, така че предполагам, че възнамерявате това да бъде декартов продукт?
За повече подробности относно взаимодействието между двете синтактични форми за присъединяване, вижте раздела Промени в обработката на присъединяване в MySQL 5.0.12 на страницата http://dev.mysql.com/doc/ refman/5.0/en/join.html
Относно вашия коментар:Както казах, това е свързано с приоритета на оператора. Ако имате SQL заявка с FROM A, B JOIN C
след това оценява B JOIN C
преди да обърне внимание на A
-- което включва присвояване на псевдоними на таблици. Така че, ако вашето условие за присъединяване за B JOIN C
използва псевдонима на таблицата за A
получавате грешка, защото този псевдоним все още не съществува.
Ако го обърнете и стартирате B, A JOIN C
след това докато оценява условието за присъединяване за A JOIN C
псевдонимът за A
е наличен и работи (поне в този случай).
Но това е крехко решение, защото може да се нуждаете и от заявка, която не може да бъде коригирана само чрез пренареждане на A
и B
. По-добре е просто да спрете да използвате остарелия синтаксис на присъединяване със запетаи. Тогава всеки израз за присъединяване има достъп до всичките ви псевдоними на таблици и никога няма да имате този проблем в нито една заявка.