Php和Mysql,从PHP-for循环中过滤出子查询到Mysql语句


Php & Mysql, filter out subqueries from PHP-for loop into MySQL statement

我必须适应一个php脚本连接到一个极其混乱的数据库设计。解释这个问题的最好方法是发布代码,我将通过代码块内的注释来描述发生了什么。加上简短的介绍:

短篇小说:
1)。有一个"mainQuery",在for循环中显示它的数据,有三个嵌套的子查询。
所有三个子查询都需要main_table_ID,以便计算每个fetched_row的出现次数。

我想要的:
1)。一个优化的mainQuery,它单独计算一个id出现3次。
2)。因此,在for循环中根本没有子查询。

我已经通过优化mainQuery实现了什么:
1)。我可以一次过滤一个子查询,参见statement:

SELECT
       main_table.id_col,
       count(table_1.a_col) AS count_1,
       main_table.a_col,
       main_table.b_col,
       main_table.c_col,
       main_table.d_col,
       main_table.e_col
FROM   main_table
LEFT JOIN
       table_1
ON
       table_1.a_col = main_table.id_col
GROUP BY
       main_table.id_col

但是当我在for循环中为其他嵌套语句之一添加另一个LEFT JOIN时,该语句将所有内容求和,并且count_1到count_3看起来相同。

现在包含子查询和for循环的代码块:

<?php
$mainQuery = "SELECT 
                          main_table.id_col, 
                          main_table.a_Col, 
                          main_table.b_Col, 
                          main_table.c_col, 
                          main_table.d_col, 
                          main_table.e_col 
                   FROM 
                          main_table";
$mainQueryResult = mysql_query($mainQuery);
$mainQueryRows = mysql_num_rows($mainQueryResult);
for($j = 0 ; $j < $mainQueryRows ; ++$j){
    //mainQuery data
    $mainQueryRow = mysql_fetch_row($mainQueryResult);
    $main_table_ID = $mainQueryRow[0];
    //first subquery, can be filtered out one at a time 
    //using introductory-statement
    $count_1_subQuery = "SELECT * FROM table_1 
                         WHERE table_1.id_col = '$main_table_ID'";
    //first subquery-count of rows with matching id
    $count_1 = mysql_num_rows(mysql_query($count_1_SubQuery, $connection));
    //second subquery
    $count_2_subquery = "SELECT * FROM table_2 
             WHERE table_2.id_col = '$main_table_ID'";
    //second subquery-count of rows with matching id
    $count_2 = mysql_num_rows(mysql_query($count_2_subQuery, $connection));
    //third subquery
    $count_3_subquery = "SELECT * FROM table_3 
             WHERE table_3.id_col = '$main_table_ID'";
    //third subquery-count of rows with matching id
    $count_3 = mysql_num_rows(mysql_query($count_3_subQuery, $connection));
    //Fill Table with count_1 to count_3 
        //and main_table.a_col to main_table.e_col
    //no problems here
}
?>

我希望我能清楚地解释这个问题,我也希望你们中的一个人能帮助我,如果他/她能分配时间来回答这样的问题。

首先在子查询中查询GROUP BY,然后在主表中查询JOIN:

SELECT  
      m  . id_col
    , g1 . count_1  
    , g2 . count_2  
    , g3 . count_3  
    , m  . a_col  
    , m  . b_col  
    , m  . c_col  
    , m  . d_col  
    , m  . e_col      
FROM 
        main_table AS m
    LEFT JOIN 
        ( SELECT id_col
              , COUNT(*) AS count_1  
          FROM table_1  
          GROUP BY id_col 
        ) AS g1
      ON g1.id_col = m.id_col
    LEFT JOIN 
        ( SELECT id_col
               , COUNT(*) AS count_2  
          FROM table_2 
          GROUP BY id_col 
        ) AS g2
      ON g2.id_col = m.id_col
    LEFT JOIN 
        ( SELECT id_col
               , COUNT(*) AS count_3  
          FROM table_3  
          GROUP BY id_col 
        ) AS g3
      ON g3.id_col = m.id_col
SELECT  
  main_table.id_col,  
  count(DISTINCT t1.id_col) AS count_1,  
  count(DISTINCT t2.id_col) AS count_2,  
  count(DISTINCT t3.id_col) AS count_3,  
  main_table.a_col,  
  main_table.b_col,  
  main_table.c_col,  
  main_table.d_col,  
  main_table.e_col      
FROM  main_table m
LEFT JOIN table_1 t1 ON (t1.id_col = m.id_col)
LEFT JOIN table_2 t2 ON (t2.id_col = m.id_col)
LEFT JOIN table_3 t3 ON (t3.id_col = m.id_col)
GROUP BY m.id_col