php – 如何计算涉及多个表的多个列的平均值和计数?
发布时间:2020-12-13 22:43:41 所属栏目:PHP教程 来源:网络整理
导读:这是我不同的表格: computers (id,name)monitors (id,name)computer_monitor (id,computer_id,monitor_id)useractivity (id,userid,timestamp,computer_monitor_id,ip)useropinion (id,rating)user (id,name,email) 我想搜索计算机或监视器的名称,并得到这
这是我不同的表格:
computers (id,name) monitors (id,name) computer_monitor (id,computer_id,monitor_id) useractivity (id,userid,timestamp,computer_monitor_id,ip) useropinion (id,rating) user (id,name,email) 我想搜索计算机或监视器的名称,并得到这样的行作为回报: computer name and/or monitor name computer_monitor_id avg(rate) count(useractivity) avg(rate)位于与名称匹配的特定computer_monitor_id上,计数相同. 没有连接到监视器的计算机在computer_monitor表中的监视器字段上的值为0,反之亦然,用于监视器 – >计算机. useractivity和useropinion仅包含computer_monitor表中的ID 解决方法
据我所知,查询应该围绕computer_monitor表构建.所有其他表连接到它,包括您要从中获取统计信息的表.
SELECT c.name AS ComputerName,m.name AS MonitorName,uo.AverageRating,ua.ActivityCount FROM computer_monitor cm LEFT JOIN computer c ON c.id = cm.computer LEFT JOIN monitor m ON m.id = cm.monitor INNER JOIN ( SELECT computer_monitor_id,AVG(rating) AS AverageRating FROM useropinion GROUP BY computer_monitor_id ) uo ON cm.id = uo.computer_monitor_id INNER JOIN ( SELECT computer_monitor_id,COUNT(*) AS ActivityCount FROM useractivity GROUP BY computer_monitor_id ) ua ON cm.id = ua.computer_monitor_id 实际上,正如您所看到的,首先聚合使用和使用,然后加入.这是为了避免当computer_monitor.id在useropinion和useractivity中匹配多行时的Cartesian product效果. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |