SELECT _objectives.id, _objectives.name, COUNT(go._iso._objective_id) FROM go._objectives INNER JOIN go._subjectHeadings ON go._subjectHeadings.id = go._objectives.subjectHeadings_id INNER JOIN go._subjects ON go._subjects.id = go._objectives.subjects_id LEFT JOIN go._iso ON go._iso._objective_id = _objectives.id WHERE go._subjectHeadings.id = 276 AND go._subjects.id = 44 GROUP BY 1,2 ORDER BY go._objectives.displayOrder 58 rows in set (24.26 sec) Did what I wanted but took as long as old method. the _iso.user_id value for this is 175 in case that can be used to speed things up. I have tried various things but they all end up with the servers hard drive going nutty and /tmp (1Gb) filling up!!! I have included the descriptions of the tables and a count on them to show number of records involved. I can't see the solution yet but I am sure it can be done with the select without me delving into indexes etc. describe _objectives; +--------------------+---------------+------+-----+---------+ | Field | Type | Null | Key | Default | +--------------------+---------------+------+-----+---------+ | id | int(10) | | PRI | NULL | | subjects_id | int(10) | YES | | NULL | | subjectHeadings_id | int(10) | YES | | NULL | | name | varchar(240) | | | | | active | enum('Y','N') | | | Y | | displayOrder | int(10) | | | 10 | | owner_id | int(10) | | | 0 | +--------------------+---------------+------+-----+---------+ SELECT count(*) from go._objectives; +----------+ | count(*) | +----------+ | 4087 | +----------+ 1 row in set (0.01 sec) describe _iso; +---------------+---------------+------+-----+---------------------+ | Field | Type | Null | Key | Default | +---------------+---------------+------+-----+---------------------+ | id | int(10) | | PRI | NULL | | student_id | int(10) | | | 0 | | ltaForm_id | int(10) | | | 0 | | lta_id | int(10) | | | 0 | | _objective_id | int(10) | | | 0 | | sta | varchar(254) | | | | | comment | varchar(254) | | | | | lecturerNotes | varchar(254) | | | | | displayOrder | int(10) | | | 100 | | manstatus | enum('W','C') | | | W | | autostatus | enum('W','C') | | | W | | recType | enum('T','L') | | | T | | active | enum('Y','N') | | | Y | | create_date | datetime | | | 2003-12-08 00:00:00 | | modified_date | timestamp(14) | YES | | NULL | | moduser_id | int(10) | | | 0 | | user_id | int(10) | | | 0 | | recuser_id | int(10) | | | 0 | | rec_date | datetime | | | 2003-12-08 00:00:00 | +---------------+---------------+------+-----+---------------------+ SELECT count(*) from go._iso; +----------+ | count(*) | +----------+ | 11498 | +----------+ 1 row in set (0.01 sec) This was on the end of both describe results. ----------------+ Extra | ----------------+ auto_increment | | | | | | | ----------------+ -- Work:- postmasterAThinwick.demon.co.uk -- MySQL General Mailing List For list archives: http://lists.mysql.com/mysql To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED]