2014-09-27 155 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