通过MySQL关联数组迭代构建新的MySQL结果集

时间:2012-10-26 16:21:38

标签: php mysql database associative-array

我希望标题有意义,如果不是,我会在这里澄清一下。首先,就像我处理的很多代码一样,我继承了这个或者只是监督它并且没有得到使用mysqli重写的好处所以请多说“你现在做错了吧”。提前谢谢。

table_1有这样的布局

+----+-----------+------------+
| id | from_name | from_email |
+----+-----------+------------+
| 1  |   John    | john@a.com |
| 2  |   Juan    | juan@a.com |
| 3  |   Mark    | mark@a.com |
| 4  |   John    | john@a.com |
+----+-----------+------------+

我会像这样查询它以获得我需要的结果。

<?php

    $q = "SELECT `id` FROM `table_1` WHERE `from_email` = 'john@a.com'";
    $r = mysql_query($q) or die(mysql_error()); // mysql_error is removed in production
    $ids = mysql_fetch_assoc($r);

 ?>

现在,当我遍历这个并将ID打印到屏幕上时,我得到了预期的结果,

1
4

现在我需要获取这些ID并在表2中的WHERE子句中使用它们来保存大小信息,这样我就可以计算所有消息的总大小。 Table_2看起来像这样。

+----+---------+------------+
| id | table_1 |    size    |
+----+---------+------------+
| 1  |    1    |   44023    |
| 2  |    2    |     372    |
| 3  |    3    |   13243    |
| 4  |    4    |  423115    |
+----+---------+------------+

根据我想要的解决方案,我应该能够构建一个while或foreach循环来获取大小并让我正确添加它们?我尝试了以下内容:

<?php

    $total_size = 0;
    while($ids = mysql_fetch_assoc($r)){
         $q2 = "SELECT `size` FROM `table_2` WHERE `table_1` = '".$ids['id']."'";
         $r2 = mysql_query($q2) or die mysql_error()); // removed in production
         $add = mysql_fetch_assoc($r2);

         $total_size = $total_size + $add['size'];
    }

 ?>

但是当我去echo $ total_size时,我什么都没看到,屏幕上甚至没有看到0,并且没有MySQL抛出任何错误。如果我原先设计了这个表,那么所有这些数据都会在同一个表中,但由于我没有,所以我别无选择,只能“让它工作”。从它的外观来看,它应该有效。

1 个答案:

答案 0 :(得分:1)

@Michael Berkowski - 感谢您的INNER JOIN和SUM()SELECT语句。效果很好。

“在一个查询中,您可以使用简单的子查询方式:SELECT size FROM table_2 WHERE table_1 IN(SELECT id FROM table_1 WHERE email ='john@a.com')或者连接方法可能更快:SELECT size FROM table_2 INNER JOIN table_1 ON table_2.table_1 = table_1.id WHERE table1.email ='john@a.com'“ - Michael Berkowski

“然后你只需要一个获取循环。实际上你甚至可以在一个查询中执行聚合COUNT()并跳过几乎所有的PHP。SELECT SUM(size)FROM table_2 INNER JOIN table_1 ....” - Michael Berkowski