Mysql查询通过将多个表与映射表组合来获取搜索结果

时间:2017-07-12 16:02:25

标签: php mysql codeigniter

我有四个表,即companies,companies_branch,company_category_map和company_category。 enter image description here 在这里,我可以将公司总部添加到公司表中,如果公司在同一个国家或不同国家/地区有分支机构,则该分支机构将被添加到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;
   }
?>

1 个答案:

答案 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的预准备语句。