在一个查询中组合sql select和avg

h22fl7wq  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(274)

我试着把 SELECT 和一个 AVG 查询成一个。我的查询正在运行,但是 AVG 结果未按预期显示。错误是:
未定义索引
我想我可以结合 AVG 以及 SELECT 这样地?
结果将是一个列表,还应显示平均进度值。如果我把这个avg查询单独放在“fetch”中,它可以工作,但只显示第一个结果。所以这不是我的解决方案,因为我将有更多的行。
我希望有人能帮我重建这个奇迹:)

<?php

  $statement = $pdo->prepare("        
    SELECT
      audit.id as audit_id, 
      audit.uid, 
      audit.assigned_auditor, 
      audit.audit_req_comment, 
      audit.audit_req_date, 
      audit.audit_date_start, 
      audit.general_audit_status, 
      audit.audit_request_date,
      audit.audit_type, 
      audit.audit_date_start,
      questionaire.quest_name, 
      users.nachname,    
      suppliers.supplier_name, 
      suppliers.supplier_city,
      suppliers.supplier_country,
      (SELECT AVG(progress) AS progress FROM answers WHERE relevant = '1' AND audit_id = :audit_id AND rating != required_answer)
    FROM audit 
    JOIN users ON audit.uid = users.id 
    JOIN suppliers ON audit.supplier_id = suppliers.id 
    JOIN questionaire ON audit.questionaire_id = questionaire.id 
    WHERE 
      audit.cid = :cid 
      AND audit.general_audit_status = 'Maßnahmenplan'
      AND audit.assigned_auditor = :assigned_auditor"
  );

  $result = $statement->execute(array(':cid' => $cid, ':assigned_auditor' => $user['id'], ':audit_id' => 4));
  $count = 1;
  while ($row = $statement->fetch()) {

    // Datum umwandeln
    $original_date = $row['audit_date_start'];
    // Creating timestamp from given date
    $timestamp = strtotime($original_date);
    // Creating new date format from that timestamp
    $new_date = date("d.m.Y", $timestamp);

    // Audit Typ Namensgebung
    if ($row['audit_type'] == "AR") {
      $audit_type = "Externes Audit";
    }
    if ($row['audit_type'] == "RA") {
      $audit_type = "Remote Audit";
    }
    if ($row['audit_type'] == "IA") {
      $audit_type = "Internes Audit";
    }
    if ($row['audit_type'] == "SAA") {
      $audit_type = "Self Assessment Audit";
    }

    //Berechne die durchschnittliche Abarbeitung aller Maßnahmen dieses Audits
    //$statement = $pdo->prepare("SELECT AVG(progress) AS progress FROM answers WHERE relevant = '1' AND    audit_id = :audit_id AND rating != required_answer");
    //$statement->execute(array(':audit_id' => $row['audit_id']));
    //$total_progress = $statement->fetch();

    echo "<tr>";

    echo "<td>" . $row['audit_id'] . "</td>";
    echo "<td>" . $new_date . "</td>";
    echo "<td>" . $row['supplier_name'] . "</td>";
    echo "<td>" . $row['supplier_city'] . " (" . $row['supplier_country'] . ")</td>";
    echo "<td>" . $row['quest_name'] . "</td>";
    echo "<td>" . $audit_type . "</td>";
    echo "<td>" . round($row['progress'], 0) . " %</td>";
    echo '<td align="center"><a href="audit_edit.php?id=' . $row['audit_id'] . '"><i class="fas fa-edit"></i></a></td>';

    echo "</tr>";
  }
?>
trnvg8h3

trnvg8h31#

我理解您的问题,您只需要在外部查询中(而不是在内部查询本身中)别名子查询的结果:

SELECT
    audit.id as audit_id, 
    audit.uid, 
    audit.assigned_auditor, 
    audit.audit_req_comment, 
    audit.audit_req_date, 
    audit.audit_date_start, 
    audit.general_audit_status, 
    audit.audit_request_date,
    audit.audit_type, 
    audit.audit_date_start,
    questionaire.quest_name, 
    users.nachname,    
    suppliers.supplier_name, 
    suppliers.supplier_city,
    suppliers.supplier_country,
    (
        SELECT AVG(progress) 
        FROM answers 
        WHERE relevant = 1 AND audit_id = :audit_id AND rating != required_answer
    ) AS progress   --> here
FROM audit 
JOIN users ON audit.uid = users.id 
JOIN suppliers ON audit.supplier_id = suppliers.id 
JOIN questionaire ON audit.questionaire_id = questionaire.id 
WHERE 
    audit.cid = :cid 
    AND audit.general_audit_status = 'Maßnahmenplan'
    AND audit.assigned_auditor = :assigned_auditor"

相关问题