【问题标题】:Multiple insert queries based on select?基于选择的多个插入查询?
【发布时间】:2014-09-27 22:13:15
【问题描述】:

以下是我的疑问:

$result4 = $this->db->query('SELECT team_leader_id FROM teams WHERE team_money < 0')->result_array();
$this->db->insert( 'd_teams', array( 'leader_id' => $result4[0]['team_leader_id'] ) );

是的,它有效,但它仅适用于 1 行,例如可以有多个甚至 50 个。我如何编辑它以支持选择查询返回的所有可用行?因此,它会将它们全部插入到 d_teams 表中的单独行中。 非常感谢!

【问题讨论】:

  • 所以,基本上,您正试图将teams 表中的所有team_leader_id 列表转换为d_teams 表中的新leader_id 列表(其中team_money 为负数)?
  • 你可以使用insert_batchstackoverflow.com/questions/3849414/…
  • 完全正确,条件来自teams table WHERE team_money &lt;0

标签: php mysql codeigniter


【解决方案1】:

我相信您尝试使用子查询可以实现:

INSERT INTO d_teams (leader_id) (SELECT team_leader_id FROM teams WHERE team_money < 0);

所以,在你的代码中:

$this->db->query('INSERT INTO d_teams (leader_id) (SELECT team_leader_id FROM teams WHERE team_money < 0)');

【讨论】:

  • 我相信它会起作用的.. 但是像下面这个家伙建议的那样使用 foreach 不是更好吗?
  • 我的意思是在服务器负载方面,主要是哪个更好?
  • 这个在服务器负载方面是最好的,因为它在您的 Web 服务和数据库实例之间生成的通信量最少。 foreach 方法在所有建议中产生最多的流量。每次您使用任何与 MySQL 相关的命令时,都会在 Web 服务和数据库之间来回发送消息。您可以在每条消息中发送的数据越多,消息传递的开销就越小。
  • 非常感谢您的解释和示例。非常感谢。
【解决方案2】:

您可以尝试在通过$result4 的循环内使用insert 函数:

$result4 = $this->db->query('SELECT team_leader_id FROM teams WHERE team_money < 0')->result_array();

foreach($result4 as $result) {
    $this->db->insert( 'd_teams', array( 'leader_id' => $result['team_leader_id'] ) );
}

也许还有另一种插入多行的方法。但这应该可行。

【讨论】:

    【解决方案3】:

    这个 SO 答案解释了如何使用 CodeIgniter 执行批量插入:https://stackoverflow.com/a/17875754/365296

    在你的情况下,我想应用它看起来像这样:

    $result4 = $this->db->query('SELECT ... ')->result_array();
    $teams = array_map(function ($dbRow) {
        return array('leader_id' => $dbRow['team_leader_id']);
    }, $result4);
    $this->db->insert_batch('d_teams', $teams);
    

    【讨论】:

    • 难道不是比实际甚至直接子查询更好的方法吗?
    • 在 PHP 中一切都很慢,所以如果性能是一个问题,请不要使用它。 ;) 但是如果你必须这样做,更快的方法是让你的 MySQL 服务器做尽可能多的工作,在这种情况下是使用子查询。
    • 所以有人建议的子查询在服务器负载等方面将是更好的方法,否则它并不重要,对吧?
    • 如果 Web 服务和数据库实例在物理上彼此相距很远,或者它们的通信中存在其他一些性能问题,因为每个查询都会生成一个串行处理的通信,这可能很重要。如果消息传递开销约为 10 毫秒,并且您对 4000 个团队使用 foreach 方法,则仅传递消息将需要 10 毫秒 * 4000 = 40 秒。等待网页加载需要很长时间。
    猜你喜欢
    • 2017-09-23
    • 1970-01-01
    • 2013-11-15
    • 2016-02-25
    • 2018-10-07
    • 1970-01-01
    • 2017-12-28
    • 1970-01-01
    • 2013-11-20
    相关资源
    最近更新 更多