Php&;Mysql,将PHP for循环中的子查询过滤到Mysql语句中

Php&;Mysql,将PHP for循环中的子查询过滤到Mysql语句中,php,mysql,subquery,Php,Mysql,Subquery,我必须修改一个PHP脚本,该脚本连接到一个极其混乱的数据库设计。 解释问题的最好方法是发布代码,我将通过代码块中的注释来描述代码中发生的事情。加上简短的介绍: 短篇小说: 1.)有一个“mainQuery”,在显示其数据的for循环中有3个嵌套子查询。2.)所有三个子查询都需要main_table_ID,以便统计每个获取的_行的发生次数 我想要什么: 1.)一个优化的mainQuery,它单独计算id的3次出现次数。 2.)因此在for循环内根本没有子查询。 我通过优化mainQuery已经取得

我必须修改一个PHP脚本,该脚本连接到一个极其混乱的数据库设计。 解释问题的最好方法是发布代码,我将通过代码块中的注释来描述代码中发生的事情。加上简短的介绍:

短篇小说:
1.)有一个“mainQuery”,在显示其数据的for循环中有3个嵌套子查询。
2.)所有三个子查询都需要main_table_ID,以便统计每个获取的_行的发生次数

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

我通过优化mainQuery已经取得的成果:
1.)我可以一次过滤一个子查询,请参见语句:

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循环中的一个嵌套语句添加另一个左连接时,该语句将所有内容相加,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
}
?>

首先
在子查询中按
分组,然后
加入主表:

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  
      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

结果:计数不正确,count_1也会对count_2和count_3的联接所做的命中进行汇总,反之亦然。在计数中添加一个
distinct
。操作:“distinct added”。结果:所有计数不超过count=“1”。不工作。仍在寻找解决方案。@kiltek:您可以尝试将:
count(DISTINCT t1.id\u col)
更改为
count(DISTINCT t1.PK)
其中
PK
表1
的主键。结果:计数不正确,count_1还汇总了join对count_2和count_3的命中率,反之亦然。在计数中添加一个
distinct
。操作:“distinct added”。结果:所有计数不超过count=“1”。不工作。仍在寻找解决方案。@kiltek:您可以尝试将:
count(DISTINCT t1.id\u col)
更改为
count(DISTINCT t1.PK)
其中
PK
表1
的主键。操作:“以上述方式修改”。结果:“按预期工作”。感谢:“以上述方式修改”。结果:“按预期工作”。谢谢