2011-05-19 69 views
4
//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

你的表定义(包括索引)是什么? – 2011-05-19 00:39:20

回答

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的结束

1

第一计查询(“获取当前成员数”)应该几乎在瞬间执行。

第二个查询(“获取产品列表”)可能会很慢,具体取决于您的索引。您正在查询m_field_name,然后在m_field_id上订购,因此您可能需要这两者的组合索引。

重复执行的第三个查询(每个产品一次)查询m_field_id_*(即任意数量的可能字段),因此您应该确保它们已被索引。总之,您需要a)找出哪些查询运行缓慢,b)索引需要编制索引的内容,以及c)如果可能,组合查询。

+0

在任何查询中都没有m_field_id_ * – 2011-05-19 01:03:40

+0

星号(*)是“通配符”或“匹配任何内容”的常用简写形式。你在查询中有这个:m_field_id _“。$ m_field_id – dkamins 2011-05-19 01:15:07

2

如果您可以用非代码术语来描述您要完成的任务,则更容易提供帮助。但是,一个问题的一个指标是在一个查询的行上看到一个php循环,而另一个查询则为每行执行一个查询。

有许多方法可以查询小计。但是如果你可以解释一下这个目标,这将更容易解释。

+0

我猜想我希望尝试做得更好的部分是获取产品列表,然后对每个产品运行查询以获得具有'y'的用户数该产品的列,它不是运行缓慢,本身,它的罚款,我们正在缓存结果。我只是想知道,如果我可以使它在系统上更少密集。 – 2011-05-19 00:56:09

+0

本质上在exp_member_data表中我们有行与member_id和每个成员显然为1行,大约有30万个成员,在同一个表中是每个产品的列,如果他们不使用或不使用该产品,单元格会说'n'或'y' – 2011-05-19 00:59:35

+0

产品名称是在一个名为exp_member_fields的表中,这个表中的每一行代表一个自定义的成员字段,因此,我想从表中获取唯一ID(X)和产品标签,代表产品的所有行,然后获取行数与exp_member_data表中的'y'列(m_field_id_X)与exp_member_fields表中的行ID相关。 – 2011-05-19 01:03:05