//get the current member count
$sql = ("SELECT count(member_id) as total_members from exp_members");
$result = mysql_query($sql) or die(mysql_error());
$num_rows = mysql_num_rows($result);
if ($num_rows != 0) {
while($row = mysql_fetch_array($result)) {
$total_members = $row['total_members'];
}
}
//get list of products
$sql = ("SELECT m_field_id, m_field_label from exp_member_fields where m_field_name like 'cf_member_ap_%' order by m_field_id asc");
$result = mysql_query($sql) or die(mysql_error());
$num_rows = mysql_num_rows($result);
if ($num_rows != 0) {
while($row = mysql_fetch_array($result)) {
$m_field_id = $row['m_field_id'];
$m_field_label = $row['m_field_label'];
$sql2 = ("SELECT count(m_field_id_".$m_field_id.") as count from exp_member_data where m_field_id_".$m_field_id." = 'y'");
$result2 = mysql_query($sql2) or die(mysql_error());
$num_rows2 = mysql_num_rows($result2);
if ($num_rows2 != 0) {
while($row2 = mysql_fetch_array($result2)) {
$p = ($row2['count']/$total_members)*100;
$n = $row2['count'];
$out .= '<tr><td>'.$m_field_label.'</td><td>'.number_format($p,1).'%</td><td>'.$n.'</td></tr>';
}
}
}
}
答案 0 :(得分:2)
如果您可以用非代码术语描述您想要完成的任务,那么帮助会更容易。但问题的一个指标是在一个查询的行中看到一个php循环,并为每一行执行另一个查询。
有多种方法可以查询小计。但是如果你能解释一下这个目标会更容易解释。
答案 1 :(得分:1)
$sql = ("SELECT count(member_id) as total_members from exp_members");
$result = mysql_query($sql) or die(mysql_error());
$row = mysql_fetch_array($result);
$total_members = $row['total_members'];
除此之外,我不知道你怎么能做得更好。您可以对两个计数查询执行相同的操作。
由于这些是直接查询,我现在认为任何瓶颈都会出现在MySQL端
答案 2 :(得分:1)
第一个COUNT个查询(“获取当前成员数”)应该几乎立即执行。
第二个查询(“获取产品列表”)可能会很慢,具体取决于您的索引。您正在查询m_field_name
,然后在m_field_id
上进行排序,因此您可能需要两者的综合索引。
第三个查询,重复执行(每个产品一次),查询m_field_id_*
(即任何可能的字段),所以你应该确保它们被编入索引。
总之,您需要a)找出哪个查询运行缓慢,b)索引需要编制索引的内容,以及c)尽可能组合查询。