我有四个表,即companies,companies_branch,company_category_map和company_category。 在这里,我可以将公司总部添加到公司表中,如果公司在同一个国家或不同国家/地区有分支机构,则该分支机构将被添加到companies_branches表中,公司总部ID作为foriegn密钥。由于主要公司和分支机构有多个类别,因此类别将映射到company_category_map表,其中包含每个主表的相应ID。
当我只是在没有加入分支表的公司表中搜索时,一切正常。
搜索如下。 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;
}
?>
答案 0 :(得分:1)
在表格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的预准备语句。