在我的PHP脚本中消除这个分层的forloop()

时间:2016-02-02 02:17:48

标签: php mysql for-loop

我的Android应用程序中的“频道”由我服务器上的MySQL数据库中的整数表示。基本上应用程序中有五个区域,每个区域有五个子通道。 “区域”将整数递增1的倍数,而子通道递增100(即区域1,子通道3等于int“300”)(即区域3,子通道3等于int“303”) )好的,所以这个php返回一个数组[5],其中包含每个区域中的用户总数。如何使此脚本更有效?它有效,但需要时间。

<?php
ini_set('display_errors',1);
$json=$_POST['user'];
$json=str_replace('\\','',$json);
$user=json_decode($json);
$pdo=new PDO('mysql://hostname=localhost;dbname=database', 'user', 'password');
$channels=array(100,200,300,400,500);
$full_status=array();
$current_status=array();

for($i=0;$i<5;$i++){
    for($j=0;$j<5;$j++){
        $total=$pdo->query("SELECT count(user_id) AS count FROM accounts WHERE channel!='0' AND channel='{$channels[$j]}'");
        $total=$total->fetchAll(PDO::FETCH_ASSOC);
        $total=$total[0]['count'];
        $current_status[$j]=$total;
        $channels[$j]++;
    }
    $full_status[]=array_sum($current_status);
}
echo json_encode(array("data"=>$full_status));
?>

2 个答案:

答案 0 :(得分:0)

首先,你的循环甚至不起作用 - 它将继续查询100,200等等。

为了使其工作,第二个循环应该如下:

for($j = $channels[$i]; $j < $channels[$i] + 5; $j++) {
    $total = $pdo->query("SELECT count(user_id) AS count FROM accounts WHERE channel='$j'");
    ...
}

但是,你可以在SQL条目中做所有事情,不管任何循环:

$result = $pdo->query("SELECT channel, count(user_id) as count FROM accounts where channel BETWEEN 100 AND 505 GROUP BY channel");

您的SQL服务器将为您提供每个频道的频道名称和用户数。

PS。我没有测试任何代码,可能会有拼写错误。

答案 1 :(得分:0)

据我所知,您将100和104,200和204,300和304,400和404以及500和504之间的频道的频道总数相加。换句话说,您希望100到104之间的通道的所有条目的总和作为组100,对于200和204之间的通道的所有条目作为组200,等等。

您可以使用以下查询执行此操作:

SELECT floor(channel/100)*100 as channelgroup,
    count(user_id) AS count FROM accounts
WHERE
    channel BETWEEN 100 AND 104 OR
    channel BETWEEN 200 AND 204 OR
    channel BETWEEN 300 AND 304 OR
    channel BETWEEN 400 AND 404 OR
    channel BETWEEN 500 AND 504
GROUP BY channelgroup

如果您知道组100中的所有频道都在100到104之间的事实,则组200中的所有频道都在200到204之间,依此类推,您可以使用以下代码:

SELECT floor(channel/100)*100 as channelgroup,
    count(user_id) AS count FROM accounts
WHERE channel > 0
# Use this if there are other channels below 100 and above 504
# WHERE channel BETWEEN 100 and 504
GROUP BY channelgroup

如果此查询看起来有点混乱,您可以在没有countGROUP BY组件的情况下运行它,以便更好地了解它的工作原理。

SELECT floor(channel/100)*100 as channelgroup,
    user_id FROM accounts
WHERE channel > 0