【问题标题】:How to join 5 tables (4 subtable + 1 primary) with sql or codeigniter 3 querybuilder?如何使用 sql 或 codeigniter 3 querybuilder 连接 5 个表(4 个子表 + 1 个主表)?
【发布时间】:2022-10-07 01:33:15
【问题描述】:

我一直在建立一个爱好项目,我想写关于电影、系列、动漫、故事等的摘要。我想将 4 个表连接到 1 个主表,但我遇到了一个问题。我得到空值。在我的数据库中,数据是存在的。但我无法弄清楚我的查询有什么问题。

概念如下。有一个界面可以记录数据。提交表单后,控制器决定记录的内容。它在主表中保存已保存的内容(动画、电影等)并增加自动增量值。然后它将主表的标识符和其他数据(描述、标题、图像等)存储在其中一个子表中。这很好用。然后想把这4个子表的内容罗列出来,这里就遇到了问题。

这是我的查询: 函数获取内容() {

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

    $this->db->join(\'films\',  \'films.content_id = contents.global_content_id\', \'left\');
    $this->db->join(\'series\', \'series.content_id = contents.global_content_id\', \'left\');
    $this->db->join(\'tales\',  \'tales.content_id = contents.global_content_id\', \'left\');
    $this->db->join(\'animes\', \'animes.content_id = contents.global_content_id\', \'left\');

    $query = $this->db->get();
    if ($query->num_rows()>0) return $query->result_array();
}

这就是我回来的:

Array
(
    [0] => Array
        (
            [global_content_id] => 2
            [content_main_category] => film
            [id] => 
            [title] => 
            [description] => 
            [short_description] => 
            [category_id] => 
            [picture_path] => 
            [running_time] => 
            [director] => 
            [release_date] => 
            [language] => 
            [actors] => 
            [main_category_id] => 
            [uploader_id] => 
            [upload_time] => 
            [link] => 
            [status] => 
            [content_id] => 
            [subtitle_status] => 
            [subtitle_language] => 
        )

    [1] => Array
        (
            [global_content_id] => 3
            [content_main_category] => film
            [id] => 
            [title] => 
            [description] => 
            [short_description] => 
            [category_id] => 
            [picture_path] => 
            [running_time] => 
            [director] => 
            [release_date] => 
            [language] => 
            [actors] => 
            [main_category_id] => 
            [uploader_id] => 
            [upload_time] => 
            [link] => 
            [status] => 
            [content_id] => 
            [subtitle_status] => 
            [subtitle_language] => 
        )
  • 如果你加入 2 或 3 或 4 或 5 没关系,他们一遍又一遍地遵循相同的原则,所以从主和一个子开始,看看你是否管理(因为这是无数的例子,可以找到并采取下一个
  • 感谢你的回答。我修改了问题。我附上了代码和最终结果。我尝试了 3-4 个小时,但没有成功。 :/
  • 你应该从内部连接开始,就像我说的那样,只从一个开始,看看你是否得到你的结果,然后慢慢来看看dofactory.com/sql/join,这样你就可以了解连接的实际工作方式。
  • 一切都是空的,意味着只有加入例如films.content_id = contents.global_content_id 没有找到任何匹配。 bur 因为我们对你的设计一无所知,所以我们也帮不了你
  • 应该预期会有空白。如果 Content 与每个其他表具有一对多的关系,则包含 all 的查询可能不是您想要的。如果 Content 与其他每个表具有 1 对 1 的关系,那么这 4 个表应该是一个与另一个类别字段的表。否则,UNION 查询 4 ​​个表并将该查询连接到 Content。

标签: php sql database join null


【解决方案1】:

谢谢你们的帮助!

这就是我想要的解决方案:

function getContents()
{
  $this->db->select('*');
  $this->db->from('films');
  $query1 = $this->db->get_compiled_select();
        
  $this->db->select('*');
  $this->db->from('animes');
  $query2 = $this->db->get_compiled_select();

  $this->db->select('*');
  $this->db->from('series');
  $query3 = $this->db->get_compiled_select();
        
  $this->db->select('*');
  $this->db->from('tales');
  $query4 = $this->db->get_compiled_select();
        
  $query = $this->db->query('SELECT * FROM ('.$query1 . ' UNION ALL ' . $query2 . ' UNION ALL ' . $query3 . ' UNION ALL ' . $query4.') AS bigtable LEFT JOIN ohf_contents ON ohf_contents.global_content_id = bigtable.content_id');

  if ($query->num_rows()>0) return $query->result_array();  


  /*       
    Pure SQL
        
    SELECT * FROM
    (SELECT * FROM ohf_films f UNION ALL
    SELECT * FROM ohf_animes a UNION ALL
    SELECT * FROM ohf_series s UNION ALL
    SELECT * FROM ohf_tales t) AS bigtable LEFT JOIN ohf_contents ON ohf_contents.global_content_id = bigtable.content_id;
  */
}

【讨论】:

    猜你喜欢
    • 2014-01-04
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多