CodeIgniter:选择id与另一个表中的不同值对应的行

时间:2013-02-14 00:18:03

标签: codeigniter distinct

我的数据库中有三个单独的表。一个包含companies列表,另一个包含company_categories列表。最后一个像categories一样。 companiescategories表中的所有行都有唯一的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_idcompany_logocompany_name。因此,如果公司(如公司5和6)拥有相同的徽标,则只会在结果中返回其中一家公司。我想两者都表明。可以使用codeigniter的活动记录来完成吗?

如果没有,如何在SQL查询中完成?

1 个答案:

答案 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');