2011-06-24 31 views
2

目前我的代码是这样的:如何加入两个MySQL statments并获得数大数据

<?php 
$qall = $db->query("SELECT * FROM location_code 
WHERE 
StateCode='".$secureStateCode."'"); 
while($fall = $db->fetch($qall)) { 
?> 
<tr> 
    <th><?php echo $fall['StateCode']; ?></th> 
    <td><?php echo $fall['StateName']; ?></td> 
    <td> 
    <?php 
    $query = $db->query("SELECT COUNT(*) AS `male_count` 
    FROM `all_users` 
    WHERE `Sex`='M' 
    AND 
    `StateCode`='{$fall['StateCode']}'"); 
    $data = $db->fetch($query); 
    echo $data['male_count']; 
    ?> 
    </td> 
    <td> 
    <?php 
    $query = $db->query("SELECT COUNT(*) AS `female_count` 
    FROM `all_users` 
    WHERE `Sex`='F' 
    AND 
    `StateCode`='{$fall['StateCode']}'"); 
    $data = $db->fetch($query); 
    echo $data['female_count']; 
    ?> 
    </td> 
    <td>Total male_count + female_count</td> 
</tr> 
<?php } ?> 

如何合并这些查询,并让他们装载总量男性&女的要快。目前我有大约50万用户。

+0

我想你想要更晚,但我不完全确定。你想要的总数是男性还是女性? – dqhendricks

+0

@dqhendricks绝对是的.. – nirmala

回答

6
$db->query(" 
    SELECT 
     `Sex`, 
     COUNT(*) AS count, 
    FROM 
     `all_users` 
    WHERE 
     `StateCode` = '{$fall['StateCode']}' 
    GROUP BY 
     `Sex` WITH ROLLUP 
"); 

应该返回三人行,像这样:

---------------- 
+ Sex + count + 
---------------- 
+ F + 12345 + 
+ M + 54321 + 
+ null + 66666 + 
---------------- 

你应该能够得到从那里休息=)

+0

nirmala - 你想在状态码上添加另一个组。这样你就可以在每个状态下得到两个(或三个,如果在性中有空值)行 – zsalzbank

+0

这就是'WITH ROLLUP'的美妙之处 - 增加更多的分组,并且不断得到摘要=) – Dereleased

+0

非常感谢你;) – nirmala

3

你这个从你改变原来的查询

SELECT COUNT(*) AS `male_count` FROM `all_users` WHERE `Sex`='M' 

对此

SELECT `Sex`, COUNT(*) AS `Amount` FROM `all_users` GROUP BY `Sex` 

这就是我如何在SQL中完成它,所以我不确定它是否在MySQL中有效。你将不得不改变你的PHP处理表以及假设的结果会是这样的方式:

Sex | Amount 
----------------- 
M  | 200000 
F  | 300000 
0

让查询做的工作你...不要让一群喋喋不休的请求的做您。

select 
     PreQuery.StateCode, 
     PreQuery.TotalRecords, 
     PreQuery.Male_Count, 
     PreQuery.Female_Count, 
     LC.* 
    from 
     (select 
       au.stateCode, 
       count(*) as TotalRecords, 
       sum(if(su.Sex = 'M', 1, 0)) as Male_Count, 
       sum(if(su.Sex = 'F', 1, 0)) as Female_Count 
      from 
       All_users au 
      where 
       au.StateCode = $secureStateCode 
      group by 
       au.StateCode) PreQuery 
     join Location_Code LC 
     on PreQuery.StateCode = LC.StateCode