![](/img/trans.png)
[英]MySQL query that deletes all rows from A table where the id is not found on B table?
[英]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
我只是通过您的PHP代码...
我已经对您的代码进行了一些更改..请看一看
<?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.