2014-09-27 111 views
0

这就是我下面的查询:基于select的多个插入查询?

$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例。我如何编辑它,以便它支持select查询返回的所有可用行?所以,它会将它们全部插入到d_teams表中的不同行中。 非常感谢!

+0

所以,基本上,你正试图将'team'表中所有'team_leader_id'列表变成'd_teams'表(其中'team_money'为负数)的新'leader_id'列表? – wavemode 2014-09-27 22:19:14

+0

你可以使用'insert_batch'参见http://stackoverflow.com/questions/3849414/codeigniter-insert-multiple-rows-in-sql#answer-14332078 – andrew 2014-09-27 22:19:57

+0

确切地说,来自'队'表的条件WHERE team_money < 0' – MobEn 2014-09-27 22:20:23

回答

2

我相信你想做什么,可以使用子查询:

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)'); 
+0

我相信它会工作耶..但是这不是更好的使用foreach这个家伙在下面建议吗? – MobEn 2014-09-27 22:39:58

+0

我的意思是在服务器负载方面,哪一个更好? – MobEn 2014-09-27 22:45:44

+2

这是一个在服务器负载方面最好的方面,因为它可以在Web服务和数据库实例之间产生最少的通信量。 foreach方法会产生所有建议的大部分流量。 每次使用任何与MySQL相关的命令时,都会在Web服务和数据库之间发回消息。每条消息中可发送的数据越多,消息传递的开销就越少。 – Emanuel 2014-09-27 22:50:30

0

您可以尝试使用通过$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'])); 
} 

也许还有另一种方式来插入多行。但这应该工作。

0

这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); 
+0

是不是比实际或甚至直接子查询更好的方法? – MobEn 2014-09-27 22:40:34

+0

在PHP中,每个都很慢,所以如果性能是一个问题,请不要使用它。 ;)但是如果必须,更快的方法是让MySQL服务器尽可能地做更多的工作,在这种情况下就是使用子查询。 – Emanuel 2014-09-27 22:45:24

+0

所以像有人建议的子查询将是更好的方法在服务器负载等方面的权利,否则它并不重要,对吗? – MobEn 2014-09-27 22:46:38