Da MySQL documentation page
precedenza, l'operatore virgola (,) e ENTRARE entrambi avevano la stessa precedenza, quindi il join espressione t1, t2 JOIN t3 è stato interpretato come ((t1, t2) ENTRARE t3). Ora JOIN ha precedenza più alta, quindi l'espressione è interpretata come (t1, (t2 JOIN t3)). Questa modifica influisce sulle istruzioni che utilizzano una clausola ON, poiché quella clausola può fare riferimento solo alle colonne negli operandi del join e la modifica nella precedenza modifica l'interpretazione di ciò che sono tali operandi.
Esempio:
CREATE TABLE t1 (i1 INT, j1 INT);
CREATE TABLE t2 (i2 INT, j2 INT);
CREATE TABLE t3 (i3 INT, j3 INT);
SELECT * FROM t1, t2 JOIN t3 ON (t1.i1 = t3.i3);
In precedenza, SELECT era legale a causa del raggruppamento implicito t1, t2 come (t1, t2). Ora il JOIN ha la precedenza, quindi gli operandi per la clausola ON sono t2 e t3. Poiché t1.i1 non è una colonna in nessuno degli operandi, il risultato è una colonna sconosciuta 't1.i1' nell'errore 'on clause'. Per consentire la giunzione da elaborare, gruppo i primi due tabelle esplicitamente con le parentesi in modo che gli operandi per la clausola ON sono (t1, t2) e t3:
SELECT * FROM (t1, t2) JOIN t3 ON (t1.i1 = t3.i3);
alternativa, evitare l'uso dell'operatore virgola e utilizzare invece:
SELECT * FROM t1 JOIN t2 JOIN t3 ON (t1.i1 = t3.i3);
Questa modifica si applica anche alle dichiarazioni che mescolano l'operatore virgola con INNER JOIN, CROSS JOIN, LEFT JOIN e RIGHT JOIN, i quali ora hanno la precedenza superiore rispetto l'operatore virgola.
tra virgolette, vuoi dire parentesi? Nella prima query, non capisco la tua spiegazione. A quale clausola si riferisce? Puoi ripetere? Grazie – Neil