In article <[EMAIL PROTECTED]>, "Jigal van Hemert" <[EMAIL PROTECTED]> writes:
> Two tables (simplified, because other fields are not used in query; indexes > other than primary key removed): > CREATE TABLE `msg_content` ( > `msg_id` int(14) NOT NULL auto_increment, > `subject` varchar(255) NOT NULL default '', > `content` mediumtext NOT NULL, > PRIMARY KEY (`msg_id`), > ) TYPE=InnoDB COMMENT='contains actual content of messages'; > CREATE TABLE `msg_addressee` ( > `id` int(14) NOT NULL auto_increment, > `account_id` int(14) NOT NULL default '0', > `msg_id` int(14) NOT NULL default '0', > `status` set('deleted','replied','forwarded','admin') default NULL, > PRIMARY KEY (`id`), > ) TYPE=InnoDB COMMENT='link table to link accounts to messages'; > A message is inserted once in the `msg_content` table and for each > from/to/cc/.. an entry is inserted in the `msg_addressee` table. > If someone deletes the message from his/her mailbox the entry in the > `msg_addressee` table is marked 'deleted' by setting the `status` field > accordingly. > I want to do some garbage collection and find the messages for which *all* > entries in the msg_addressee table have the status field set to 'deleted' > This is what I came up with: > SELECT t1.`msg_id` > FROM `msg_content` AS t1 > JOIN `msg_addressee` AS t2 ON t1.`msg_id` = t2.`msg_id` AND > FIND_IN_SET( t2.`status` , 'deleted' ) >0 > LEFT JOIN `msg_addressee` t3 ON t1.`msg_id` = t3.`msg_id` AND > FIND_IN_SET( t3.`status` , 'deleted' ) =0 > GROUP BY t2.`msg_id` , t3.`msg_id` > HAVING COUNT( t3.`msg_id` ) =0 Try the following: SELECT t1.msg_id FROM msg_content t1 LEFT JOIN msg_addressee t2 ON t1.msg_id = t2.msg_id AND FIND_IN_SET ('deleted', t2.status) = 0 WHERE t2.id IS NULL -- MySQL General Mailing List For list archives: http://lists.mysql.com/mysql To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED]