James Black <[EMAIL PROTECTED]> wrote on 11/21/2005 09:39:32 AM: > -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA1 > > Using mysql 5.0.15 my query gets a result of "Unknown column 'i.rid' in > 'on clause'" > > There is actually a complete query, but this is a snippet, as the > selects with subqueries I don't believe will cause the problem. When I > changed c.rid=i.rid to c.rid=c.rid, the query executes. It is incorrect, > but at least it runs, so, it appears that that the last join is where > the problem is. > > Any suggestions as to what might be the cause? Thanx. > > FROM items i, nams.netids n > INNER JOIN nams.names AS na ON n.badge=na.badge > INNER JOIN nams.affiliations AS a ON a.badge=na.badge > INNER JOIN nams.roles AS r ON a.role=r.code > LEFT OUTER JOIN nams.regterms AS t ON (na.badge=t.badge) > LEFT OUTER JOIN curuse AS c ON (c.rid=i.rid) > WHERE i.rid=12415 AND n.netid='alb' AND i.status='A' AND c.badge IS NULL > LIMIT 1; > <snip> > - -- > "Love is mutual self-giving that ends in self-recovery." Fulton Sheen > James Black [EMAIL PROTECTED] > -----BEGIN PGP SIGNATURE----- > Version: GnuPG v1.4.1 (MingW32) > Comment: Using GnuPG with Thunderbird - http://enigmail.mozdev.org > > iD8DBQFDgdwkikQgpVn8xrARAky9AJ4lcBoVIsqkU2nBpca6fAZZsl5dvgCfR3H5 > 7ed5A7RcOLrcm2XxQh/zSD8= > =+Xos > -----END PGP SIGNATURE----- >
The query engine became more ANSI compliant with v5.0.12. Beginning with that version the prioritization of your comma-declared CROSS JOIN ("FROM items i, nams.netids n") changed so that the explicit JOINS happen first. That means that when you say "LEFT OUTER JOIN curuse AS c ON (c.rid=i.rid)" the table `items` has not been added to the "list of tables participating in this query" yet so it's columns cannot be used as part of an ON clause. Two ways around it: 1) use parentheses to modify the JOIN priorities so that the CROSS JOIN happens first FROM (items i, nams.netids n) INNER JOIN nams.names AS na ON n.badge=na.badge INNER JOIN nams.affiliations AS a ON a.badge=na.badge INNER JOIN nams.roles AS r ON a.role=r.code 2) use an explicit INNER JOIN or CROSS JOIN command (** my recommendation). FROM items i CROSS JOIN nams.netids n INNER JOIN nams.names AS na ON n.badge=na.badge INNER JOIN nams.affiliations AS a ON a.badge=na.badge INNER JOIN nams.roles AS r ON a.role=r.code A detailed explanation of this behavior is in THE FINE MANUAL: http://dev.mysql.com/doc/refman/5.0/en/join.html Shawn Green Database Administrator Unimin Corporation - Spruce Pine