I have attached images of the joins and filters I have in place (with the phone filter omitted for now).


The contact_entities table holds "companies" a company can have many addresses and an address can have many people so the address table is joined to companies(contact_entities) by holding a contact_entity_id and the contact_people are joined to addresses by holding a contact_address_id.
The search function is designed to be used by anybody in our organisation. Some may be more familiar with addresses others may know the people they are looking up by name others may have a "call history" in front of them so would find it necessary to search the number only to see who/where or which company the call came from etc etc.
As you can see it is possible to join all the tables in an aggregate and for the most part all the search functions work as expected except when the system fills the search conditions automatically from a 'snapshot'. When it does this it fills all search conditions if they are available (which is something a human would not typically do) and runs the search automatically, typically turning up 0 results until the user omits the phone number, then it will return the desired result including the phone number. This is undesirable as the users are encouraged to enter the person/company/address into the database if it does not exist in our data already and asking them to omit the phone number to find out is not acceptable.
I am already using funnels to try and slim down the queries dependent on which inputs have been submitted as you can see in this image but there must be the ability to return the correct results when all filters are populated.

Any more suggestions are much appreciated.
Thanks