[英]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.