加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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效果.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读