我在这里问了一个问题,非常感谢Gordon Linoff对其 SQL 部分的完整回答。
问题
我有一个 sql 表(使用 PRIMARY KEY = [ ip & id ] ),如下所示:
ip | id | visits
我想从该表中生成一个 php 数组,如下所示:
product_rating_for_ip = array(
ip=>array(
id=>rating, id=>rating, ...
),
ip=>array(
id=>rating, id=>rating, ...
),
.
.
.
);
例如:
product_rating_for_ip = array(
"78.125.15.92"=>array(
1=>0.8,2=>0.2,3=>1.0
),
"163.56.75.112"=>array(
1=>0.1,2=>0.3,3=>0.5,8=>0.1,12=>1.0
),
.
.
.
);
Gordon Linoff 建议了这个运行良好的 SQL 查询:
SQL 查询
select v.ip, group_concat(concat(v.id, ':', v.visits / iv.maxvisits)) as ratings
from visit v join
(SELECT ip, id, visits, max(visits) as maxvisits
FROM visit
GROUP BY ip
) iv
on v.ip = iv.ip
group by v.ip;
产生这个:
+-------------+--------------------------+
|ip |ratings |
+-------------+--------------------------+
|154.18.72.15 |2:0.1667,1:1.0000,3:0.1667|
|162.16.18.22 |1:1.0000,3:0.3750,2:0.1250|
|142.128.1.14 |2:1.0000,1:0.2500,3:0.5000|
|78.15.92.131 |1:0.1429,3:1.0000,2:0.2857|
+-------------+--------------------------+
问题总结
如何将此结果集放入此 PHP 数组中?
product_rating_for_ip = array(
ip=>array(
id=>rating, id=>rating, ...
),
ip=>array(
id=>rating, id=>rating, ...
),
.
.
.
);
我有问题的答案
我认为我应该这样做(可能不正确或效率低下):
$stmt = mysqli_prepare($con, "select ...");
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt,$ip,$ratings);
while (mysqli_stmt_fetch($stmt)){
$value_array = explode(",",$ratings);
product_rating_for_ip = array_fill_keys($ip, $value_array);
}