我的数据库中有两个表:
网页记录
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;
}
当用户使用单词搜索时,它会在webHistory中排成一行,因此要获取用户在过去24小时内所做的所有搜索,我会计算两个日期之间的行数。
当用户按位置搜索时,将检查数据库以查看用户是否已在该位置搜索过,如果是,则增加金额,如果不是,则添加值为1的行。然后我从第二个查询中得到了这个的SUM。
最后,如果用户通过word&查询这两个操作都会将行添加到webHistory并在locationHistory中添加/递增。
我需要将查询1的响应添加到查询2的响应中,格式为hour =>量。所以:
查询“网络历史记录”:
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增加了amount字段,因此导致唯一id只是最新的ID并且对于这个问题是多余的,我不知道如何处理它。
我在考虑将数组合并到array_marge()?但这将是解决这个问题的最佳方式,最重要的是我将如何处理问题的后半部分。
干杯
答案 0 :(得分: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合并到locationhistory上,这样如果它们重叠,则会覆盖以前的值。
修改强>
以下解决了第一个问题
$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 )