2015-06-10 33 views
1

我有一個查詢,可以根據排名爲我選擇我的數據庫中的所有節目的位置。我需要將它們插入到「排名歷史」表看起來像這樣:用計數器插入多行到表

Table:Ranking_History 
Ranking_id Show_id Date Position 
1    3     1 
2    18     2 
3    2     3 

事情目前,我正在通過PHP所有的位置,然後將其插入到我的數據庫。事情是這樣的:

$positions = Show::get_positions(); 
$pos = 1; 
foreach ($positions as $key=>$val) { 
    INSERT INTO ranking_history (show_id, date, position) VALUES ('$val', CURDATE(), '$pos') 
    $pos++; 
} 

有沒有一種方法可以讓我避免運行多個查詢的開銷滯後,並插入到一個單一查詢呢?

就像INSERT...SELECT聲明,但需要有某種計數器可以跟蹤當前的「行」。在這種情況下,開銷成本甚至是重要的考慮因素(我每天插入大約6000行)。我相當肯定它需要通過存儲過程完成,但對於該類別中的MySQL來說,這是相當新穎的。

+0

如果你這樣做一次,然後包裹在foreach的交易,並在年底提交。我懷疑它會跑得快很多。我建議你不要改變查詢。時間運行需要多長時間。然後,您可以根據建議決定是否更改爲「單個查詢」。如果您將其轉換爲「準備好的查詢」並使用「綁定並執行」,那麼它會更快。 –

回答

1

插入可以採取多套值的,所以首先創建它們,然後運行單個插入

$values=''; 
    foreach ($positions as $key=>$val) { 
     $values .= "('$val', CURDATE(), '$pos'),"; 
     $pos++; 
    } 

    $values=rtrim($values,','); //remove left over comma 

    $q="INSERT INTO ranking_history (show_id, date, position) VALUES ".$values; 

//run $q