【问题标题】:Codeigniter JOIN using two tables - need data from bothCodeigniter JOIN 使用两个表 - 需要来自两个表的数据
【发布时间】:2023-03-24 10:15:01
【问题描述】:

我正在尝试在 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;   

    } 

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

【问题讨论】:

  • 最好在 team_has_fixture 中有另一列名为 team_id2,然后您可以在一个夹具中找到两支球队的徽标。 team_id 和 team_id2 参考团队表。
  • 谢谢山姆 - 我想我明白它是如何工作的。现在研究如何编写从两个表中给我值的 JOIN
  • 提供一些示例数据可能会对您有所帮助。

标签: mysql sql codeigniter join relational-database


【解决方案1】:

如果我正确理解您的要求,夹具是涉及两个团队的项目。每个灯具都有一个唯一的id号,所以如果灯具3涉及7队和5队,那么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 中。但这应该可以帮助您入门。

【讨论】:

  • 感谢您回答我的问题。我尝试像您一样将团队放入一个夹具中 - 在team_id and fixture_id 下的 team_has_fixture 中插入两行,当我在桌子上进行测试查询时,它返回两个相同的夹具,即它创建了两个夹具而不是一个夹具以两个团队为特色
猜你喜欢
  • 1970-01-01
  • 2021-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-20
  • 2012-12-16
  • 1970-01-01
相关资源
最近更新 更多