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、最初に集約されてから結合されます。これは、 がと の両方で複数の行に一致する場合のデカルト積効果を回避するためです。computer_monitor.iduseropinionuseractivity

于 2012-04-29T17:02:46.747 に答える
0

これでうまくいくかもしれません...(コンピューター/モニター関係シップを持つ1つのテーブル、xrefテーブルを持つもう1つのテーブルが私を投げ、データに応じて結合タイプを確認してください)

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 に答える
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 に答える