我的数据库中有三个单独的表。一个包含companies
列表,另一个包含company_categories
列表。最后一个像categories
一样。 companies
和categories
表中的所有行都有唯一的ID。 company_categories
表中没有唯一的ID。
这是我的companies
表格的示例:
company_id | company_name | logo | ....
-----------+------------------+-----------+--------
5 | Co 5 | 123.jpg | ....
6 | Company 6 | 123.jpg | ....
7 | 7's a company | 234.jpg | ....
8 | EightCo | 345.jpg | ....
这是我的categories
表格的示例:
category_id | category_name
------------+-----------
1 | Blue
2 | Red
3 | Green
4 | Yellow
我的companies_categories
看起来像是什么:
company_id | category_id
-----------+-----------
5 | 2
5 | 3
6 | 1
6 | 2
7 | 1
注意:company_id和category_id在相关表中都有外键
我要做的是列出所有具有特定类别的公司。例如,如果选择类别2,则应返回公司5和6。如果选择类别4,则不应显示任何内容。永远不应该显示公司8(因为它没有与之关联的类别)
我试图通过在活动记录中使用codeigniter的distinct()函数来解决这个问题:
$this->db->from('company_categories')
->distinct()
->where('category_id', $category_id)
->join('companies', 'companies.company_id = company_categories.company_id')
->select('companies.company_id as co_id companies.logo as co_logo, companies.name as co_name')
->get()->result();
但实际上做的是获得明确的company_id
,company_logo
和company_name
。因此,如果公司(如公司5和6)拥有相同的徽标,则只会在结果中返回其中一家公司。我想两者都表明。可以使用codeigniter的活动记录来完成吗?
如果没有,如何在SQL查询中完成?
答案 0 :(得分:2)
正如@Rick所说,你不需要distinct
。此外,您应该从companies
进行选择,然后加入company_categories
而不是相反。
你的SQL应该是这样的:
SELECT * FROM companies
JOIN companies_categories
ON companies.company_id=companies_categories.company_id
WHERE category_id = 2
更新了sqlfiddle:http://www.sqlfiddle.com/#!2/d1f24/16/0
在codeigniter中:
$this->db->select('companies.company_id as co_id, companies.logo as co_logo, companies.name as co_name')
$this->db->where('display_flg',true);
$this->db->join('company_categories', 'companies.company_id = company_categories.company_id');
$query = $this->db->get('companies');