【问题标题】:How to get results from multiple tables using a single query in CodeIgniter?如何使用 CodeIgniter 中的单个查询从多个表中获取结果?
【发布时间】:2015-05-01 09:02:36
【问题描述】:

我有一种情况,我需要从 7 个不同的表中获取数据以执行特定的处理。

我需要 7 个简单的 SELECT 所有语句,没什么花哨的。但是为了最大限度地减少对数据库的影响,我非常希望将这些查询捆绑到 1 或 2 个查询中。

喜欢:

select * from table1; select * from table2; select * from table3;. 

并将从我的代码中调用此查询。是否有可能在 PHP 中 .net 的 DataSet 的类似行中获得结果。我正在寻找核心 PHP 或 CodeIgniter 的解决方案。我正在使用 PDO 进行数据库连接。

PS:表有不同的模式,没有共同点。所以任何带有 join 或 union 的解决方案都行不通。

$results = $this->db-query("select * from tb1; select * from tb2");

现在$result[0] 应该有来自 tb1 的所有记录,$results[1] 应该有来自 tb2 的记录。

类似的东西在这种情况下最有帮助。

【问题讨论】:

  • 您没有提供表结构或实际代码。请更新您的问题。 p.s 这是 CodeIgnitE 不是 CodeIgnitor。
  • 我不需要为您提供任何代码,因为它不是我编码并陷入其中的东西。这只是一种在 .NET 中很容易处理的情况,但我在 php 中找不到解决方案。
  • 使用联合查询获取所有表数据
  • 您需要提供一个表结构以确定表之间是否存在共同点。使用union 关键字,因为没有。

标签: php mysql codeigniter pdo


【解决方案1】:

查看 InnerJoin。这就是您一次进行多项选择的方式 - 假设您有一个共同的数据点

【讨论】:

  • 没有共同点。我只是想连接 2 个或更多选择语句并尝试将结果放入数组数组中。
  • 详细定义所有字段怎么样? SELECT a.a, a.b, z.a, z.b FROM c AS a, y AS z - AS 是您甚至可能不需要的额外功能...这应该可以,但我从未在超过 2 张桌子上尝试过...
【解决方案2】:

你需要的是UNION

$this->db->query('SELECT column_name(s) FROM table_name1 UNION ALL SELECT column_name(s) FROM table_name2');

UNION ALL 这是 UNION 关键字,也是可选的 ALL 关键字。 UNION 表示 UNION 之前的 SELECT 语句的结果将与 UNION 之后的 SELECT 语句的结果合并。

当您使用 ALL 关键字时,不会从联合生成的组合集中删除重复的行。这可以显着提高查询的性能,因为 Access 不必检查重复行的结果。如果满足以下任一条件,则应使用 ALL 关键字:

  • 您确定选择查询不会产生任何 重复行。

  • 结果是否有重复行无关紧要。

  • 您想查看重复的行。

已编辑

在您的版本以及我从您的问题中得到的内容之后,这可能会有所帮助。您需要循环该查询以获取results 的数组

$tablename = array('name1','name2','name3','name4','name5','name6','name7');
$results = array();
foreach($tablename as $key => $value){
    $results[$key] = $this->db->query("select * from ".$value."")->result_array();
}

【讨论】:

  • 问题是,所有的表都有不同的模式,所以在这种情况下不能使用联合。我将更新我的问题以强调这一事实。
  • 然后更新您可能需要以更好的方式理解的问题..
  • @Narendra Sisodia 我想避免这种方法。我的目标是最大限度地减少数据库命中,这是 foreach 做不到的。
【解决方案3】:

codigniter 中的多选查询

 $this->db->select('t1.*, t2.*');
 $this->db->from('table1 AS t1, table2 AS t2');
 $query = $this->db->get();
 $row = $query->result_array();
 print_r($row);

【讨论】:

  • 这不会导致他们的笛卡尔积吗?也就是说,如果每个表中有三行,你会得到九行吗?
  • 这会访问数据库一次还是两次?来自不同表的记录是否会在不同的结果集中可用?我对此表示怀疑。
  • 这将访问数据库一次,并为您提供数组中可用的所有表结果
  • 这会给我两张表的笛卡尔积。不是我想要的
  • @halfer 我的查询从 exm 返回两个表的笛卡尔积。如果一个表中有 6 条记录,另一张表中有 14 条记录,它将返回 72 条记录。
猜你喜欢
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-15
  • 2013-08-10
  • 2011-10-24
相关资源
最近更新 更多