2014-06-17 18 views
0

我在我的數據庫中的兩個表:合併陣列,增加值加在一起

網頁記錄

SEARCHTERM | userId |日期| hasLocation | historyId

LocationHistory。

userId |日期| lat | lng |數額| historyId

我按照這樣排隊。

網絡歷史記錄:

$stmt_hour = $conn->prepare("SELECT HOUR(date) as hr, COUNT(*) as num_rows FROM  
          webHistory WHERE userId=? AND date BETWEEN (SYSDATE() - INTERVAL 1 DAY) 
          AND SYSDATE() GROUP BY HOUR(date);"); 

$stmt_hour->bind_param("s", $userid); 
$stmt_hour->execute(); 
$stmt_hour->bind_result($a, $b, $c); 
    while($stmt_hour->fetch()) { 
    $hourArr[$a] = $c; 
    } 

位置記錄

$stmt_hour = $conn->prepare("SELECT HOUR(date) as hr, COUNT(*) as num_rows FROM  
          locationHistory WHERE userId=? AND date BETWEEN (SYSDATE() - INTERVAL 1 DAY) 
          AND SYSDATE() GROUP BY HOUR(date);"); 

$stmt_hour->bind_param("s", $userid); 
$stmt_hour->execute(); 
$stmt_hour->bind_result($a, $b, $c); 
    while($stmt_hour->fetch()) { 
    $hourLocArr[$a] = $c; 
    } 

當一個字一個用戶搜索,它一行到網絡歷史記錄,所以讓所有的搜索的用戶在過去的24小時內創建了兩個日期之間的行。

當用戶按位置進行搜索時,將檢查數據庫以查看用戶是否已在該位置搜索,如果是,則數量遞增,如果不是該行添加值爲1。然後我從第二個查詢中得到這個SUM。

最後,如果用戶搜索字&查詢兩個操作發生將行添加到webHistory並在locationHistory中添加/遞增。

我需要將查詢1的響應添加到查詢二的響應中,格式爲小時=>金額。所以:

查詢 '網絡歷史記錄':

10 => 9 
16 => 4 
20 =>2 

查詢位置歷史

4 => 45 
10 => 2 
22 => 12 

查詢+位置的總和

4 => 45 
10 => 11 
16 => 4 
20 => 2 
22 => 12 

最後,如果搜索字&查詢我只需要採取位置的值,我想我會通過一個獨特的Id做到這一點。到目前爲止,我確實有一個獨特的Id字段。但是,由於locationHistory遞增金額字段,從而導致唯一的ID只是最近的ID和冗餘的這個問題,我不知道如何處理它。

我想組合數組來簡單地使用array_marge()?但是,這將是解決這個問題的最好方式,最重要的是我將如何處理問題的後半部分。

乾杯

+2

爲什麼不聯合查詢(如果需要),並做邏輯SQL? – kero

+0

我曾考慮過這個問題,但是如果搜索只在webHistory或Location上,但是如果它們都在兩者上,則我將如何組合查詢。如果只用一個詞進行搜索,它會在webHistory中添加一行。如果僅在該位置製作,則會在locationHistory中添加一行/增加數量。如果搜索是通過一個單詞和位置進行的,它會增加或增加兩者,但它只計算一次搜索,因此我只需要其中一個表的結果。 –

+1

這兩個表格有幾個共同的字段。您可能可以使用連接。實驗有很多種。 –

回答

0

閱讀stackoverflow陣列後,聯盟是你最好的選擇(第二個問題)由於本款

+操作返回附加到左手右手陣列陣列;對於這兩個數組中存在的鍵,將使用左側數組中的元素,並忽略右側數組中的匹配元素。

$webHistory = array(10 => 9, 
16 => 4, 
20 =>2); 

$locationHistory = array(4 => 45, 
10 => 2, 
22 => 12); 

print_r($locationHistory + $webHistory); 

->Array ([4] => 45 [10] => 2 [22] => 12 [16] => 4 [20] => 2) 

它保留了密鑰,並使用locationHistory作爲信息的主要來源。 :D

因此,請確保您將webhistory合併到位置歷史記錄上,以便它們重疊的位置將覆蓋以前的值。

編輯

下解決了第一個問題

$webHistory = array(10 => 9, 
16 => 4, 
20 =>2); 

$locationHistory = array(4 => 45, 
10 => 2, 
22 => 12); 

$tempArray = $locationHistory; 
foreach ($webHistory as $key => $value){ 
    $tempArray[$key] = $value + $tempArray[$key]; 
} 
print_r($tempArray); 

->Array ([4] => 45 [10] => 11 [22] => 12 [16] => 4 [20] => 2)