1

我有 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。

我想为表 B 中属于 b_ID 的所有 a_ID 获取表 A 中的 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 比应有的多。

我试图尽可能地解释这一点,但它似乎不是很好。

4

3 回答 3

0

好的-评论后我想我明白你的最终目标是平均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

于 2013-03-31T12:55:22.477 回答
0

我只是在浏览你的php代码......

  1. 首先在您的第一个查询中使用 distinct ..
  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>"; 
           }

        ?>
于 2013-03-31T13:01:23.460 回答
0

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

于 2013-03-31T13:07:53.473 回答