簡體   English   中英

MySQL查詢通過將多個表與映射表組合來獲取搜索結果

[英]Mysql query to fetch search results by combining multiple tables with a mapped table

我有四個表,分別是company,companies_branch,company_category_map和company_category。 在此處輸入圖片說明 在這里,我可以將公司總部添加到公司表中,如果在同一國家或不同國家/地區有該公司的分支機構,則該分支機構將被添加到companies_branches表中,並且公司總部ID為前鍵。 由於主要公司和分支機構具有多個類別,因此這些類別將使用每個主表的相應ID映射到company_category_map表。

當我只搜索不帶分支表的公司表時,一切正常。

搜索如下。 1.僅使用公司名稱進行搜索2.僅使用類別進行搜索3.僅使用國家進行搜索4.使用以上3的任意組合進行搜索

我需要的是

如果國家或類別在表中的任何一個中,並且公司名稱不應重復,則我應該能夠顯示公司表中的所有公司名稱。

任何想法或幫助將不勝感激。 恐怕我無法更改表結構,因為已經插入了數千條記錄。 但是,如果仍然需要更改表,我可以嘗試一下而不會丟失數據。

我沒有加入company_branches表的嘗試如下。

<?php 
function search_companies($limit,$start,$companyname='',$category_id='',$country_id='') 
    {
        if($category)
        {
            $qry = "SELECT `companies`.* FROM `companies` INNER JOIN `company_category_map` ON (`companies`.`id` = `company_category_map`.`company_id`) INNER JOIN `company_category` ON (`company_category_map`.`category_id` = `company_category`.`id`) WHERE `companies`.`status` =1";
            $where = " and `company_category_map`.`category_id` = $category";
            if($companyname) $where .= ' and `companies`.`company_name` like "%'.$companyname.'%"';
            if($country_id) $where = " and `companies`.`country_id` = $country_id";
        }
        else
        {
            $qry = "SELECT * FROM `companies` WHERE `status` = 1";
            if($companyname) $where .= " AND `heading` LIKE '%".$companyname."%'";
            if($country_id) $where .= " AND `country_id` = $country_id";
        }

        $qry = $qry.$where." limit  $start, $limit";

        $query = $this->db->query($qry)->result();

        if (count($query) > 0) {
            foreach ($query as $row) {
                $data[] = $row;
            }
            return $data;
        }
        return false;
   }
?>

在表company_category_map ,有一個列type 是否用於確定該行是否與公司記錄與分支記錄匹配?

如果是這樣,將需要對company_category_map上的聯接進行一些更改。

該SQL不會處理其他搜索,但是很容易將它們添加到where子句中。 關鍵是要顯示如何匹配總公司或分支機構中的類別。

更新:添加了對空類別的檢查,以消除沒有匹配類別的行。

更新:添加了對要加入company_category_map的公司類型(主要或分支)的測試。

SELECT 
    a.`id`,
    a.`country_id`,
    a.`company_name`,
    a.`logo`,
    a.`address`,
    a.`phone`
FROM `companies` a
LEFT JOIN `companies_branches` a1
ON a1.`company_id` = a.`id`
LEFT JOIN `company_category_map` b
ON  (a.`id` = b.`company_id` AND b.`type` = 'm') OR 
    (a1.`id` = b.`company_id` AND b.`type` = 'b') AND 
    `b.status` = 1
LEFT JOIN `company_category` c
ON b.`category_id` = c.`id`
WHERE c.`id` = @category_id AND
    (NOT c.`id` IS NULL)
GROUP BY a.`id`;

確保將您的代碼轉換為對mysqli或PDO使用准備好的語句。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM