I have a possible 4 table join, and things are ugly.

I'm trying to implement a zipcode based search and i can't seem to narrow down the rows properly. Now here are my tables (i took out several irrelevant columns though)

Code:
CREATE TABLE `member` (
  `member_id` int(10) unsigned NOT NULL auto_increment,
  `member_firstname` varchar(45) NOT NULL default '',
  `member_lastname` varchar(45) NOT NULL default '',
  `member_email` varchar(45) NOT NULL default '',
  `member_password` varchar(45) NOT NULL default '',
  `member_status  varchar(1) NOT NULL default '',
  `member_country` varchar(45) NOT NULL default '',
  `member_lastlogin` datetime default '0000-00-00 00:00:00',
  `member_state` varchar(45) NOT NULL default '',
  `member_city` varchar(45) NOT NULL default '',
  `member_moniker` varchar(45) default '',
  `member_zipcode` varchar(5) NOT NULL default '',
  PRIMARY KEY  (`member_id`),
  KEY `idx_email` (`member_email`),
  KEY `idx_password` (`member_password`),
  KEY `idx_zipcode` (`member_zipcode`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


CREATE TABLE `profile` (
  `profile_memberid` int(10) unsigned NOT NULL default '0',
  `profile_businessid` int(10) unsigned NOT NULL default '0',
  `profile_status` enum('I','C','P') NOT NULL default 'I',
  `profile_views` int(10) unsigned NOT NULL default '0',
  `profile_aboutme` text NOT NULL,
  `profile_headline` varchar(250) NOT NULL default '',
  `pofile_url` text,
  PRIMARY KEY  (`profile_memberid`),
  KEY `profile_memberid` (`profile_memberid`),
  KEY `profile_businessid` (`profile_businessid`),
  KEY `mpbusmemid` TYPE BTREE (`profile_businessid`,` profile_status`,` profile_memberid`),
  KEY `indx_status` (` profile_status`)) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC;

CREATE TABLE `zipcodes` (
  `zipcode` varchar(5) NOT NULL default '0',
  `latitude` float NOT NULL default '0',
  `longitude` float NOT NULL default '0',
  `city` varchar(45) NOT NULL default '0',
  `state` varchar(45) NOT NULL default '0',
  `abbr` char(2) NOT NULL default '0',
  PRIMARY KEY  (`zipcode`),
  KEY `indx_latitude` (`latitude`),
  KEY `indx_longitude` (`longitude`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='InnoDB free: 230400 kB';

CREATE TABLE `business` (
  `bus_id` int(11) NOT NULL default '0',
  `bus_name` varchar(50) NOT NULL default '',
  `bus_address` varchar(100) default NULL,  
  PRIMARY KEY  (`bus_id),
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

In pseudo SQL here is what I am trying to accomplish:

"Given a zipcode, find all active & members, their profile information, and an associated business within x miles radius "

Here is one of the queries I tried running with no success, I AM ABSOLUTELY TERRIBLE at multi-table joins for some reason, I don't ever remember having this kind of SQL trouble before, it's like I'm in a slump or something The subquery is basically "borrowed" from a thread here at SP and simply does a quick lookup of several zipcodes that match the criteria I'm looking for based on a starting lat and lon, and those hard coded floating point numbers were just taken right out of my query right before it ran in my page. Anyhow, it's not the zipcode lookup I'm having trouble with, it's basically joining all these tables & derived tables together properly. It's driving me insane!


Code:
SELECT 	m.member_id, 
		m.member_firstname, 
		m.member_lastname, 
		m.member_country, 
		m.member_city, 
		m.member_state,  
		mp.profile_businessid, 
		mp.profile_aboutme, 
		mp.profile_headline, 
		b.bus_name 
FROM 	( 	SELECT	zipcode, 
					sqrt(pow(latitude - 42.1819, 2) + pow(longitude - -73.3664, 2))*66.6666666667 as distance 
			FROM 	zipcodes 			
			WHERE	latitude between 42.1819 - 0.75 and 42.1819 + 0.75 and longitude between -73.3664 - 0.75 and -73.3664 + 0.75 
		) as zip,
			
		member m INNER JOIN profile  p on m.member_id = mp.profile_memberid , 
		business b 
WHERE 	m.member_status = 'A' 
  		AND	b.bus_id IN('36') 
		AND b.bus_id = mp.profile_businessid 
		AND zip.zipcode = m.member_zipcode 
LIMIT 0, 10
As always, any help, insight, suggestions, etc. are always appreciated.