使用两个表的Codeigniter JOIN - 需要两者的数据

时间:2014-02-21 00:17:03

标签: mysql sql codeigniter join relational-database

我正在尝试为Codeigniter中的两个团队创建一个夹具。我的数据库是在MySQL Workbench中构建的。我有一个团队表

team

team_id
team_name
team_logo

我还有一个夹具表。

fixture 

fixture_id
fixture_text
fixture_comp
fixture_type
fixture_level
fixture_date

这两个表之间的关系是多对多的,它创建了一个名为team_has_fixture的JOIN表,它有一个由team_id和fixture_id构成的复合PK

team_has_fixture

team_id
fixture_id

我正在尝试创建一个夹具,该夹具使用夹具表中的所有数据以及团队表中夹具中涉及的两个团队的团队徽标。

例如夹具的布局将如下所示 - 团队1徽标 - 夹具细节 - 团队2徽标

我想在单个查询中实现此目的但不知道如何实现。

我可以单独从两个表中获取所有信息而不会出现问题。我还可以使用模型中的以下代码从JOIN表team_has_fixtures中获取夹具数据;

灯具模型

function fixtures() 

    {

        //Query the team_has_fixture table for every record and row  

        $results = array(); 

        $this->db->select('*');
        $this->db->from('team_has_fixture');

        $this->db->join('team', 'team_has_fixture.team_team_id = team.team_id');
        $this->db->join('fixture', 'team_has_fixture.fixture_fixture_id= fixture.fixture_id');

        $query = $this->db->get();

        if($query->num_rows() > 0) 
        {
         $results = $query->result();
        }

        return $results;   

    } 

我不确定如何将代码合并到连接中以获取创建包含两个团队徽标的夹具所需的数据

1 个答案:

答案 0 :(得分:0)

如果我理解你的要求,夹具是一个涉及两个团队的项目。每个夹具都有一个唯一的ID号,所以如果第3组和第5组涉及夹具3,那么team_has_fixture中将有两行,就像这样。

team_id    fixture_id
   5            3
   7            3

我还假设您可以依靠您的系统来避免仅将一个团队分配给一个装置,或者分配两个以上的团队。

您需要一种方法来为每个灯具提取两个团队。在SQL中,这个子查询将为每个夹具提供一行,并提到两个团队。通过使用HAVING COUNT(*) = 2,此查询会将夹具与其他数量的团队排除在外。

 SELECT MIN(team_id) AS team_a_id,
        fixture      AS fixture_id,
        MAX(team_id) AS team_b_id
   FROM team_has_fixture
  GROUP BY fixture_id
 HAVING COUNT(*) = 2

然后,您可以构建一个SQL查询来提供您提到的结果集。

 SELECT t1.team_logo  AS team_a_logo,
        f.*,
        t2.team_logo  AS team_b_logo
  FROM  fixture AS f
  JOIN  (
           SELECT MIN(team_id) AS team_a_id,
                  fixture      AS fixture_id,
                  MAX(team_id) AS team_b_id
             FROM team_has_fixture
            GROUP BY fixture_id
           HAVING COUNT(*) = 2
        ) AS j ON f.fixture_id = j.fixture_id
  JOIN team AS t1 ON t1.team_id = j.team_a_id
  JOIN team AS t2 ON t2.team_id = j.team_b_id

看看发生了什么?我们采用双向连接表并将其聚合为三向连接子查询。然后我们进行三向连接,这就是你的结果。

请原谅;我不知道如何将这样的查询呈现到Codeigniter中。但这应该让你开始。