(response interspersed) Jasper Bryant-Greene <[EMAIL PROTECTED]> wrote on 10/17/2005 07:49:36 PM:
> Just recently (possibly since upgrading to MySQL 5.0.13 RC), I've been > getting the following error with queries like the one below. > > Unknown column 'photos.id' in 'on clause' (1054) > > SELECT photos.* > FROM photos > LEFT JOIN tags_photos ON tags_photos.photo = photos.id ^ I suspect that the error isn't here ------------- > WHERE 1 > AND tags_photos.tag IN (6) > AND NOT EXISTS ( > > SELECT 1 > FROM tags AS t > LEFT OUTER JOIN tags_photos AS t2 ON ( > t.id = t2.tag AND t2.photo = photos.id ^ it's here ----------------------------- > ) > WHERE t.id IN (6) > AND t2.tag IS NULL > > ) > GROUP BY photos.id > > > This was working previously, and there is definitely an `id` column in > the `photos` table. The table definitions follow: > > > CREATE TABLE `photos` ( > `id` int(10) unsigned NOT NULL auto_increment, > `filename` varchar(100) NOT NULL, > `caption` varchar(200) NOT NULL, > `description` text NOT NULL, > `user` int(10) unsigned NOT NULL default '0', > `exif` longtext NOT NULL, > `uploaded` int(10) unsigned NOT NULL default '0', > `modified` int(10) unsigned NOT NULL, > `privacy` > enum('public','friends-family','friends','family','private') NOT NULL > default 'public', > `rights` enum('copyright','creative-commons','public-domain') NOT > NULL default 'copyright', > `notes` text NOT NULL, > `offensive` tinyint(1) unsigned NOT NULL, > `resizeMode` varchar(5) NOT NULL, > `allowOriginal` tinyint(1) NOT NULL default '1', > `licenseURL` varchar(200) NOT NULL, > `licenseName` varchar(50) NOT NULL, > `licenseButton` varchar(250) NOT NULL, > PRIMARY KEY (`id`), > KEY `user` (`user`), > KEY `uploaded` (`uploaded`), > KEY `privacy` (`privacy`), > KEY `modified` (`modified`), > CONSTRAINT `photos_ibfk_1` FOREIGN KEY (`user`) REFERENCES `users` (`id`) > ) ENGINE=InnoDB DEFAULT CHARSET=utf8 > > > CREATE TABLE `tags_photos` ( > `tag` int(10) unsigned NOT NULL default '0', > `photo` int(10) unsigned NOT NULL default '0', > PRIMARY KEY (`tag`,`photo`), > KEY `photo` (`photo`), > CONSTRAINT `tags_photos_ibfk_1` FOREIGN KEY (`tag`) REFERENCES `tags` > (`id`), > CONSTRAINT `tags_photos_ibfk_2` FOREIGN KEY (`photo`) REFERENCES > `photos` (`id`) > ) ENGINE=InnoDB DEFAULT CHARSET=utf8 > > > CREATE TABLE `tags` ( > `id` int(10) unsigned NOT NULL auto_increment, > `tagName` varchar(50) NOT NULL, > PRIMARY KEY (`id`) > ) ENGINE=InnoDB DEFAULT CHARSET=utf8 In this case, I don't think that the query parser is correctly parsing your EXISTS subquery within the context of the outer query. It's probably a bug and you should submit a test case for resolution. To get your query to work in the mean time, don't use subqueries use joins. I *think* you are looking for photos that are not tagged so here is how I would re-write your query. Let me know if I guessed incorrectly. SELECT DISTINCT photos.* FROM photos LEFT JOIN tags_photos tp ON tp.photo = photos.id LEFT JOIN tags t on tp.tag = t.id WHERE tags_photos.tag IN (6) AND t.id IS NULL; I also made a few editorial changes: 1) using a GROUP BY with no aggregate functions (sum(), avg(), min(), max(), etc) is illogical as your results will be indeterminate. If you do not want duplicate rows, you have two options: deduplicate your data or use the DISTINCT modifier. 2) "WHERE 1" is always true so it plays no useful part in your WHERE clause. I removed it. 3) Technically, the IN comparator should be used with lists of values and an = should be used for comparing single values. However, I understand the pattern you are using and single values are legal in an IN comparison is allowed on MySQL (not so with other RDBMSs) so it can stay. As I said above, if I didn't divine the correct question your query was designed to answer, just fill me in and I will happily rewrite the query to fit. Shawn Green Database Administrator Unimin Corporation - Spruce Pine