4

这是我的不同表:

computers (id,name)
monitors (id,name)
computer_monitor (id, computer_id,monitor_id)
useractivity (id,userid,timestamp,computer_monitor_id,ip)
useropinion (id,userid,computer_monitor_id,timestamp,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,反之亦然monitor->computer

useractivity 和 useropinion 仅包含来自 computer_monitor 表的 ID

4

3 回答 3

1

据我了解,查询应该围绕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

实际上,正如您所看到的,useropinion并且useractivity首先聚合,然后加入。这是为了避免在 a 与 in和 in匹配多行时出现笛卡尔积效应。computer_monitor.iduseropinionuseractivity

于 2012-04-29T17:02:46.747 回答
0
<?php
$res_comp = mysql_query("select * from computers where name = '$name'");
$res_monitor = mysql_query("select * from monitor where name = '$name'");
if(mysql_num_rows($res_comp) > 0)
{
$row_comp = mysql_fetch_array($res_comp);
$comp_id = $row_comp['id'];
$res_result = mysql_query("select computers.name, computer_monitor.id, count(computer_monitor_id) from computers, computer_monitor, useractivity where computers.id = '$comp_id' AND computer_monitor_id = '$comp_id' AND useractivity.computer_monitor_id = '$comp_id'");

}
// repeat the same for monitor also. then use mysql_fetch_array to show your data.
?>

希望这会有所帮助。

于 2012-04-29T15:29:55.600 回答
0

可能会奏效......(一个带有计算机/监视器关系的表,另一个带有外部参照表的表扔给我,并根据您的数据检查连接类型)

SELECT computers.name AS ComputerName
    , monitors.name AS MonitorName
    , AVG(useropinion.rating) AS AvgRating
    , COUNT(useractivity.id) AS ActivityCount
FROM computers
INNER JOIN computer_monitor ON (computers.id = computer_monitor.computer_id)
INNER JOIN useractivity ON (computers.id = useractivity.computer_id)
INNER JOIN monitors ON (computer_monitor.monitor_id = monitors.id)
INNER JOIN useropinion ON (computer_monitor.id = useropinion.computer_monitor_id) AND (monitors.id = useractivity.monitor_id)
INNER JOIN USER ON (useropinion.user_id = user.id) AND (useractivity.user_id = user.id)
于 2012-04-29T15:41:06.813 回答