Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • Home
  • SEARCH
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 6668155
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 26, 20262026-05-26T03:00:36+00:00 2026-05-26T03:00:36+00:00

I have created a search functionality to my cake application. It is built from

  • 0

I have created a search functionality to my cake application. It is built from multiple select boxes in which you can select data, then it cycles through the selected options and implements them to the SQL syntax.

Basically this is how the function looks like:

$selectedFilters = $this->data;
        $selectSQL =    'SELECT
                        agencies.agency, agencies.website_url, agencies.status, agencies.size, agencies.id, OfficeData.id, ContactData.name, ContactData.surname, ContactData.job_title, ContactData.email, 
                        ContactData.mobile, OfficeCountryData.country
                        FROM agencies
                        LEFT JOIN (SELECT agencies_industries.agency_id, agencies_industries.industry_id FROM agencies_industries) AS IndustryData ON agencies.id = IndustryData.agency_id
                        LEFT JOIN (SELECT agencies_professions.agency_id, agencies_professions.profession_id FROM agencies_professions) AS ProfessionData ON agencies.id = ProfessionData.agency_id
                        LEFT JOIN (SELECT agencies_sectors.agency_id, agencies_sectors.sector_id FROM agencies_sectors) AS SectorData ON agencies.id = SectorData.agency_id
                        LEFT JOIN (SELECT agencies_seniorities.agency_id, agencies_seniorities.seniority_id FROM agencies_seniorities) AS SeniorityData ON agencies.id = SeniorityData.agency_id
                        LEFT JOIN (SELECT agencies_zones.agency_id, agencies_zones.zone_id FROM agencies_zones) AS ZonesData ON agencies.id = ZonesData.agency_id
                        LEFT JOIN (SELECT agencies_countries.agency_id, agencies_countries.country_id FROM agencies_countries) AS CountryData ON agencies.id = CountryData.agency_id
                        LEFT JOIN (SELECT agencies_regions.agency_id, agencies_regions.region_id FROM agencies_regions) AS RegionData ON agencies.id = RegionData.agency_id
                        LEFT JOIN (SELECT agencies_cities.agency_id, agencies_cities.city_id FROM agencies_cities) AS CityData ON agencies.id = CityData.agency_id
                        LEFT JOIN (SELECT agencies_specialisms.agency_id, agencies_specialisms.specialism_id FROM agencies_specialisms) AS SpecialismData ON agencies.id = SpecialismData.agency_id
                        LEFT JOIN (SELECT offices.id, offices.agency_id, offices.hq FROM offices WHERE offices.hq = "1") AS OfficeData ON agencies.id = OfficeData.agency_id
                        LEFT JOIN (SELECT countries.id, countries.country FROM countries) AS OfficeCountryData ON OfficeData.hq = OfficeCountryData.id
                        LEFT JOIN (SELECT contacts.name, contacts.surname, contacts.agency_id, contacts.job_title, contacts.email, contacts.mobile FROM contacts) AS ContactData ON agencies.id = ContactData.agency_id
                        ';
        $whereSQL = ' WHERE 1 = 1 ';
            foreach($selectedFilters as $key)
                foreach($key as $name=>$value){
                    if(is_array($key))
                        foreach($key as $key=>$value){
                            $i = 0;
                            $connector = 'AND';
                            if(is_array($value)){
                                foreach($value as $value){
                                    if($i > 0)
                                        $connector = 'OR';
                                    $i++;
                                    switch($key){
                                        case 'Profession': $whereSQL .= $connector.' ProfessionData.profession_id = ' . $value . ' ';
                                        break;
                                        case 'Specialism': $whereSQL .= $connector.' SpecialismData.specialism_id = ' . $value . ' ';
                                        break;
                                        case 'SubSpecialism': $whereSQL .= ''; //$whereSQL .= $connector.' SubData.sub_specialism_id = ' . $value . ' ';
                                        break;
                                        case 'Seniority': $whereSQL .= $connector.' SeniorityData.seniority_id = ' . $value . ' ';
                                        break;
                                        case 'Industry': $whereSQL .= $connector.' IndustryData.industry_id = ' . $value . ' ';
                                        break;
                                        case 'Zone': $whereSQL .= $connector.' ZonesData.zone_id = ' . $value . ' ';
                                        break;
                                        case 'Country': $whereSQL .= $connector.' CountryData.country_id = ' . $value . ' ';
                                        break;
                                        case 'Region': $whereSQL .= $connector.' RegionData.region_id = ' . $value . ' ';
                                        break;
                                        case 'City': $whereSQL .= $connector.' CityData.city_id = ' . $value . ' ';
                                        break;
                                        case 'Sector': $whereSQL .= $connector.' SectorData.sector_id = ' . $value . ' ';
                                        break;
                                        case 'status': $whereSQL .= $connector.' agencies.status = "' . $value . '" ';
                                        break;
                                        case 'size': $whereSQL .= $connector.' agencies.size = "' . $value . '" ';
                                        break;
                                    }
                                }
                            }
                            else
                                if(!isBlank($value) && $key != 'Search')
                                    $whereSQL .= $connector.' agencies.'.$key.' = "'.$value.'" ';
                        }
                }
        $groupBySQL = 'GROUP BY agencies.id ORDER BY agencies.id ASC';
        $resultAgencies = $this->Agency->query($selectSQL . $whereSQL . $groupBySQL);
        $this->set(compact('resultAgencies'));

The problem I encountered with my search is that it works really slow. This happens because of using too many LEFT JOIN commands. Every LEFT JOIN selects data from distinct tables and gathers them all creating another table. Then the data is displayed.

I need someone to give me a hint how to do this not using so many LEFT JOINs.

Cheers.

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-26T03:00:36+00:00Added an answer on May 26, 2026 at 3:00 am

    Try this one:

    $selectSQL =    'SELECT
                            agencies.agency, agencies.website_url, agencies.status, agencies.size, agencies.id, OfficeData.id, ContactData.name, ContactData.surname, ContactData.job_title, ContactData.email, 
                            ContactData.mobile, OfficeCountryData.country
                            FROM agencies
                            LEFT JOIN agencies_industries AS IndustryData ON agencies.id = IndustryData.agency_id
                            LEFT JOIN  agencies_professions AS ProfessionData ON agencies.id = ProfessionData.agency_id
                            LEFT JOIN  agencies_sectors AS SectorData ON agencies.id = SectorData.agency_id
                            LEFT JOIN  agencies_seniorities AS SeniorityData ON agencies.id = SeniorityData.agency_id
                            LEFT JOIN  agencies_zones AS ZonesData ON agencies.id = ZonesData.agency_id
                            LEFT JOIN agencies_countries AS CountryData ON agencies.id = CountryData.agency_id
                            LEFT JOIN  agencies_regions AS RegionData ON agencies.id = RegionData.agency_id
                            LEFT JOIN  agencies_cities AS CityData ON agencies.id = CityData.agency_id
                            LEFT JOIN  agencies_specialism AS SpecialismData ON agencies.id = SpecialismData.agency_id
                            LEFT JOIN  offices  AS OfficeData ON (agencies.id = OfficeData.agency_id AND OfficeData.hq = "1")
                            LEFT JOIN countries AS OfficeCountryData ON OfficeData.hq = OfficeCountryData.id
                            LEFT JOIN  contacts AS ContactData ON agencies.id = ContactData.agency_id
                            ';
    

    But even then it might be slow since you join too many tables. But it’s hard to tell without knowing anything about your data and the amount of rows that you’ll return. You might want to move some JOINS to a subquery (like country) if you only return a few rows. Or you can add that information in a seperate query.

    Edit:
    Without knowing your data and db-structure it’s hard to tell. There are a lot of things that influence the speed of your query. First rewrite your query so that tables that are not used for your selection (i.e. the WHERE) or fields you want to show are not used in your query. So if you make no selection (emtpy $selectedFilters) the you don’t have to include the industries, professions, sectors, seniorities, etc tables.:

    $selectedFilters = $this->data;
            $selectSQL =    'SELECT
                            agencies.agency, agencies.website_url, agencies.status, agencies.size, agencies.id, OfficeData.id, ContactData.name, ContactData.surname, ContactData.job_title, ContactData.email, 
                            ContactData.mobile, OfficeCountryData.country
                            FROM agencies';
    
    
            $sql2='                LEFT JOIN  offices  AS OfficeData ON (agencies.id = OfficeData.agency_id AND OfficeData.hq = "1")
                            LEFT JOIN countries AS OfficeCountryData ON OfficeData.hq = OfficeCountryData.id
                            LEFT JOIN  contacts AS ContactData ON agencies.id = ContactData.agency_id
                            ';
    
            $whereSQL = ' WHERE 1 = 1 ';
                foreach($selectedFilters as $key)
                    foreach($key as $name=>$value){
                        if(is_array($key))
                            foreach($key as $key=>$value){
                                $i = 0;
                                $connector = 'AND';
                                if(is_array($value)){
                                    foreach($value as $value){
                                        if($i > 0)
                                            $connector = 'OR';
                                        $i++;
                                        switch($key){
                                            case 'Profession': $whereSQL .= $connector.' ProfessionData.profession_id = ' . $value . ' ';
                                            $sql2.=' LEFT JOIN  agencies_professions AS ProfessionData ON agencies.id = ProfessionData.agency_id ';
                                            break;
                                            case 'Specialism': $whereSQL .= $connector.' SpecialismData.specialism_id = ' . $value . ' ';
                                            $sql2.=' LEFT JOIN  agencies_specialism AS SpecialismData ON agencies.id = SpecialismData.agency_id ';
                                            break;
                                            case 'SubSpecialism': $whereSQL .= ''; //$whereSQL .= $connector.' SubData.sub_specialism_id = ' . $value . ' ';
                                            break;
                                            case 'Seniority': $whereSQL .= $connector.' SeniorityData.seniority_id = ' . $value . ' ';
                                            $sql2.=' LEFT JOIN  agencies_seniorities AS SeniorityData ON agencies.id = SeniorityData.agency_id ';
                                            break;
                                            case 'Industry': $whereSQL .= $connector.' IndustryData.industry_id = ' . $value . ' ';
                                            $sql2=' LEFT JOIN agencies_industries AS IndustryData ON agencies.id = IndustryData.agency_id ';
                                            break;
                                            case 'Zone': $whereSQL .= $connector.' ZonesData.zone_id = ' . $value . ' ';
                                            $sql2.=' LEFT JOIN  agencies_zones AS ZonesData ON agencies.id = ZonesData.agency_id ';
                                            break;
                                            case 'Country': $whereSQL .= $connector.' CountryData.country_id = ' . $value . ' ';
                                            $sql2.=' LEFT JOIN agencies_countries AS CountryData ON agencies.id = CountryData.agency_id ';
                                            break;
                                            case 'Region': $whereSQL .= $connector.' RegionData.region_id = ' . $value . ' ';
                                            $sql2.=' LEFT JOIN  agencies_regions AS RegionData ON agencies.id = RegionData.agency_id ';
                                            break;
                                            case 'City': $whereSQL .= $connector.' CityData.city_id = ' . $value . ' ';
                                            $sql2.=' LEFT JOIN  agencies_cities AS CityData ON agencies.id = CityData.agency_id ';
                                            break;
                                            case 'Sector': $whereSQL .= $connector.' SectorData.sector_id = ' . $value . ' ';
                                            $sql2.='LEFT JOIN  agencies_sectors AS SectorData ON agencies.id = SectorData.agency_id ';
                                            break;
                                            case 'status': $whereSQL .= $connector.' agencies.status = "' . $value . '" ';
                                            break;
                                            case 'size': $whereSQL .= $connector.' agencies.size = "' . $value . '" ';
                                            break;
                                        }
                                    }
                                }
                                else
                                    if(!isBlank($value) && $key != 'Search')
                                        $whereSQL .= $connector.' agencies.'.$key.' = "'.$value.'" ';
                            }
                    }
            $groupBySQL = 'GROUP BY agencies.id ORDER BY agencies.id ASC';
            $resultAgencies = $this->Agency->query($selectSQL . $sql2 . $whereSQL . $groupBySQL);
            $this->set(compact('resultAgencies'));
    

    Second take a good look at your indexes for each table. Make sure you have an index on the fields you use in the JOINS.

    Third, look at the field types you use. Don’t use a INT if a SMALLINT is large enough.

    Finaly: Normalization is great, but sometimes it’s better to combine some things, even if that means you have duplicate data.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I have created my application that has search form and below contains results for
I have a CMS that I am adding Site Search functionality. The application uses
In our new project we have to provide a search functionality to retrieve data
Good Morning, I have created an ASP.NET 3.5 webform that allows users to search
Has anyone created a website with MLS search/listing functionality? Currently, brain storming how something
I'm trying to implement search functionality in my app, which is very basic at
I'm trying to create some search functionality across several types of data, with autocomplete.
Suppose I have a search functionality in front end written in Java. I have
I need to implement some search functionality within a Rails application. Most of the
This is kind of a weird problem, but I have to create a search

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.