Php 复杂SQL选择以计算单个列的评级
这可能被认为是重复的,但我的问题更复杂。我有一个MySQL表,其中包含以下字段:Php 复杂SQL选择以计算单个列的评级,php,mysql,arrays,select,Php,Mysql,Arrays,Select,这可能被认为是重复的,但我的问题更复杂。我有一个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, pr
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的所有产品访问量的最大值。例如:
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查询是不正确的,因为它没有显示实际的预期结果。我们的想法是使用子查询来计算总和,然后进行计算并将值放入一个逗号分隔的列中,您可以在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\u 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
“评级等于某个ip的单个产品访问量除以该ip的所有产品访问量的最大值”似乎是
SUM
而不是MAX
。不,它是最大值。访问量最大的产品是比较和评级其他产品的基础。访问次数最多的产品的评分为1分,其他产品的评分为0到1分,但在您的示例中,没有产品的评分为1分。是的,谢谢您的评论。这是打字错误,我会很快编辑,但是如何生成php数组呢。我觉得那部分也很烂。请你把答案也填上,好吗?我执行了这个查询。它不保持值的顺序。为什么?我执行了这个查询。它不保持值的顺序。为什么?例如,对于单个ip,它列出的评级为:0.2500,0.5000,1.0000 for(4,1,2)。感谢您的时间和完整的答案,但我无法提取id
s以推送到php数组。你能帮我吗?@Arash。我的专长是SQL而不是php,所以我不是一个很好的人来帮助解决这方面的问题。