Nesměšujte syntaxi spojení SQL-89 "ve stylu čárky" s SQL-92 JOIN syntax. Existují drobné problémy s předností těchto dvou typů operací spojení.
Ve vašem případě to má za následek, že vyhodnocuje podmínku spojení LEFT JOIN před u alias tabulky existuje. Proto neví, co je u.usr_auto_key je.
Tento problém můžete napravit pomocí JOIN syntaxe pro všechna spojení:
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)
Neviděl jsem žádnou podmínku spojení mezi u a s ve vašem dotazu, takže předpokládám, že to zamýšlíte jako kartézský produkt?
Další podrobnosti o interakci mezi dvěma formuláři syntaxe pro spojení naleznete v části Join Processing Changes in MySQL 5.0.12 na stránce https://dev.mysql.com/doc/ refman/5.0/en/join.html
K vašemu komentáři:Jak jsem řekl, souvisí to s prioritou operátora. Pokud máte dotaz SQL s FROM A, B JOIN C pak vyhodnotí B JOIN C než věnuje pozornost A -- to zahrnuje přiřazení aliasů tabulek. Takže pokud je vaše podmínka připojení pro B JOIN C používá alias tabulky pro A zobrazí se chyba, protože tento alias ještě neexistuje.
Pokud to otočíte a spustíte B, A JOIN C poté, když vyhodnotí podmínku spojení pro A JOIN C alias pro A je k dispozici a funguje (alespoň v tomto případě).
Toto je však křehké řešení, protože možná budete potřebovat také dotaz, který nelze opravit pouhým přeuspořádáním A a B . Je lepší přestat používat zastaralou syntaxi spojení s čárkami. Pak má jakýkoli spojovací výraz přístup ke všem aliasům vašich tabulek a tento problém už nikdy nebudete mít v žádném dotazu.