this可能会被视为副本,但我的问题在某种程度上更为复杂。我有一个包含以下字段的MySQL表:
ip | product_id | visits
显示了ip访问过产品的次数。我终于想生成一个像这样的php数组:
product_rating_for_ip = array(
ip=>array(
product_id=>rating, product_id=>rating, ...
),
ip=>array(
product_id=>rating, product_id=>rating, ...
),
.
.
.
);
评分等于某个ip产品的单个产品的访问次数除以该ip的所有产品访问的MAX。例如:
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
),
.
.
.
);
我做了什么:
SELECT ip, id, visits, MAX(visits) FROM visit GROUP BY ip
我有性能方面的考虑,我希望避免嵌套循环中的SQL查询。我认为上面的SQL查询不正确,因为它没有显示预期的结果。
答案 0 :(得分:1)
这个想法是使用子查询来计算总和,然后进行计算并将值放入一个以逗号分隔的列中,您可以在php中将其转换为数组:
select v.ip, group_concat(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;
编辑:
SQL中的表本质上是无序的,并且SQL中的排序不稳定(意味着不保留原始顺序)。您可以在group_concat()
语句中指定排序。例如,以下内容将按id
:
select v.ip, group_concat(v.visits / iv.maxvisits order by id) 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;
这将按照最高评级排序:
select v.ip, group_concat(v.visits / iv.maxvisits order by v.visits desc) as ratings
您可以使列表更复杂,也可以在其中加入id
:
select v.ip,
group_concat(concat(v.id, ':', v.visits / iv.maxvisits)) as ratings