繁体   English   中英

获取表A中几个SQL行(a_ID和avg_data)的平均值,其中在表B中(a_ID按b_ID分组)

[英]get the average of several SQL rows (a_ID and avg_data) in table A where in table B (a_ID is grouped by b_ID)

我有2张桌子。 表A,表B

Table A:

a_ID (313, 314, 315, 322) avg_data (50, 920, 12, 16)

Table B:

a_ID (313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323) 
b_ID (204, 204, 204, 205, 205, 206, 207, 208, 209, 210, 210)

因此,多个a_ID属于一个b_ID。

我想获取表A中所有属于表B中b_ID的a_ID的平均值avg_data。我试图在php中做到这一点。

就像是:

 GET the list of a_ID in table B that have the same b_ID, then search table_A for all these ID's in the list and get the average of their respective avg_data column.

这可能仅用一条SQL语句来完成吗?

到目前为止,我已经尝试过

 $qry="SELECT b_ID
    FROM table_B";              

 $result= mysql_query($qry);

 while($row = mysql_fetch_assoc($result)) {

    $[b_ID] =$row['b_ID'];
  }

  foreach($b_ID as $value) {

  $qry="SELECT a_ID
    FROM table_B WHERE b_ID = '$value'";                

  $result= mysql_query($qry);


  while($row = mysql_fetch_assoc($result)) {

      $a_ID[] =$row['a_ID'];



   }

   $search = implode(', ', $a_ID); 

   echo $search; 

  }   

所以这应该输出

 313, 314, 315 <br> 316, 317 <br> 318 <br> 319 etc

但实际上输出:

 313, 314, 315, 322, 313, 314, 315

 313, 314, 315, 322, 313, 314, 315, 316, 317

 313, 314, 315, 322, 313, 314, 315, 316, 317, 318

这是为了获得属于每个b_ID的a_ID的列表,以便我可以找到平均值,但是,输出不正确,并且包含的​​a_ID比应有的多。

我已经尽力解释了这一点,但是它似乎并不是很好。

好的-经过评论,我想我知道您的最终目标是avg_data的平均值。 这可以在一个简单的查询中完成,该查询在两个表之间执行INNER JOIN b_ID分组。

SELECT
  Tableb.b_ID,
  AVG(TableA.avg_data) AS average
FROM
  TableB
  INNER JOIN TableA ON TableA.a_ID = TableB.a_ID
GROUP BY TableB.b_ID

http://sqlfiddle.com/#!2/349ba/12

现在,如果您还希望在输出中列出a_ID ,它将变得更加复杂。 您需要将其结果作为对TableB的子查询返回,以获取a_ID列表,然后可以通过GROUP_CONCAT()将它们分组为一个逗号分隔的值列表,这些值共享相同的平均值:

SELECT 
  GROUP_CONCAT(b.a_ID), 
  avgs.average
FROM 
  TableB b
  /* Makes sure only a_ID existing in TableA appear in the output */
  INNER JOIN TableA a ON b.a_ID = a.a_ID
  INNER JOIN (
    /* Retrieves average avg_data for like b_ID values */
    SELECT
      Tableb.b_ID,
      AVG(TableA.avg_data) AS average 
    FROM
      TableB
      INNER JOIN TableA ON TableA.a_ID = TableB.a_ID
    GROUP BY TableB.b_ID
  ) avgs ON b.b_ID = avgs.b_ID
GROUP BY avgs.b_ID

http://sqlfiddle.com/#!2/349ba/21

我只是通过您的PHP代码...

  1. 首先在您的第一个查询中使用..
  2. 创建$ a_ID时,需要根据b_id将它们分组。

我已经对您的代码进行了一些更改..请看一看

 <?php
        mysql_connect('localhost','root','');
        mysql_select_db('test');

        $qry="SELECT distinct b_ID
            FROM Table_B";              

         $result= mysql_query($qry);

         while($row = mysql_fetch_assoc($result)) {

            $b_ID[] =$row['b_ID'];
          }


          foreach($b_ID as $value) {

          $qry="SELECT a_ID
            FROM yable_B WHERE b_ID = '$value'";                

          $result= mysql_query($qry);


          while($row = mysql_fetch_assoc($result)) {

              $a_ID[$value][] =$row['a_ID'];



           }
          }   


          foreach( $a_ID as $value)
           {
             $search = implode(',',$value);
             echo $search ."<br>"; 
           }

        ?>

select distinct b_ID, (select avg(avg_data) from table_A where a_ID in (select a_ID from table_B y where y.b_ID=x.b_ID) ) from table_B x

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM