Php&;Mysql,将PHP for循环中的子查询过滤到Mysql语句中
我必须修改一个PHP脚本,该脚本连接到一个极其混乱的数据库设计。 解释问题的最好方法是发布代码,我将通过代码块中的注释来描述代码中发生的事情。加上简短的介绍: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已经取得
短篇小说:
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
的主键。操作:“以上述方式修改”。结果:“按预期工作”。感谢:“以上述方式修改”。结果:“按预期工作”。谢谢