在类别中拆分数据集,并在PHP / MySQL中计算这些类别中的数据集

时间:2014-10-06 21:04:58

标签: php mysql arrays split

我有一个菜单。每餐都有牛肉,猪肉,鸡肉,沙拉等类别。现在我想要获取每餐,根据类别将它们分开并将它们保存在一个数组中。因此我对每个类别都有一个带饭的阵列。最后一步是计算每个类别的膳食量,但是当我在那里时这很容易。

我目前的尝试非常糟糕。我为每个类别创建一个带有过滤器的mysql_query,然后计算数据集的秒数。所以我有一个类别两个查询。如果我最后有30个类别,则服务器必须为一个页面视图处理60个查询。

for($i=0; $i < $30; $i++)
{
    $fetchMeal="SELECT * FROM Menu WHERE Categorie = '$categorie[$i]'";
    $countMeals = mysql_query("SELECT count(*) from Menu WHERE Categorie = '$categorie[$i]'");
}

我只想要一个获取所有数据集,将它们分类并计算这些类别中的数据集。有没有人知道一个好的,简单的方法来实现这个目标?

示例表:

name          | categorie
-----------------------
tomato-salad  | salads
potatotfish   | fish
peppersteak   | beef
schnitzel     | pork
ceasar-salad  | salad
another-fish  | fish
fish-fish     | fish
roast pork    | pork

等...

现在我希望每个类别都有数组:

salads[0] -> tomato-salad
salads[1] -> ceasar-salas

fish[0] -> potatofish
fish[1] -> another-fish
fish[2] -> fish-fish

beef[0] -> peppersteak

pork[0] -> schnitzel
pork[1] -> roast pork

2 个答案:

答案 0 :(得分:1)

您需要ORDER BY您的类别。类似的东西:

SELECT * FROM menu
ORDER BY categorie, name

然后,您可以将这些内容读入PHP数组中。另一种方法是,按类别分组很容易,就是这样做:

SELECT DISTINCT categorie FROM menu

然后循环结果并每次都这样做:

SELECT * FROM menu WHERE categorie = $categorie

就我个人而言,我会做第一个,因为你可以抓住类别,然后只需将项目推送到数组:

$meals[$categorie][] = $name;

您提到您对每页60个查询不满意。在你的情况下, 效率低下,但是60个查询本身并不一定是坏事。请记住,它是计算的总运行时间,而不是查询的数量。有时将问题分解为几个较小的查询可以比一个较大的查询更快地执行。

答案 1 :(得分:0)

我现在的解决方案是按类别订购数据集。如果我echo得到结果,它应该如下所示:

category | meal
---------+----------
fish     | cookes fish
fish     | potato-fish
fish     | fish-fish
fish     | another-fish
pork     | roast pork
pork     | schnitzel
beef     | peppersteak
salad    | tomato-salad
salad    | ceasar-salad 
salad    | another-salad

然后你必须找出你有多少类别。因为我在另一个表中有类别的名称,我可以用它们来计算:

$result = mysql_query("SELECT count(*) from categories");
$NumberOFCategories = mysql_result($result, 0);

当您没有额外的表时,您必须进行此查询:

SELECT DISTINCT categorie FROM menu

使用PHP foreach循环计算您获得的数据集。然后我将每个数据集保存在一个带有foreach循环的数组中。

$i = 0 //counter
$menu = array();

while($tabellenInhalt = mysql_fetch_object($erg))
{
    $menu[$i][0]=$tabellenInhalt -> Category ;
    $mneu[$i][1]=$tabellenInhalt -> Meal;

    $i = $i+1; 
}

现在有了棘手的部分。您将第一个类别保存在持有人变量中。并为计数器创建一个变量,稍后您将需要foreach循环。

然后你创建一个for循环,它与你拥有的许多类别一样长(你在开始时得到了数字)。之后,只要持有者变量和类别相等,就可以在数组中进行foreach循环。我告诉你我的代码:

$m = 0; //counter for every dataset
$j = 0; //counter for the datasets in a category
$holder = $menu[$m][0]; //holds the actual/next category
$splittedMenu = array();

for($n = 0; $n < $NumberOfCategories; $n++) //Count three every company
{
        while($menu[$m][2] == $halter) //test if Category is still the same.
        {
            $splittedMenu [$n][$j][0] = $menu[$m][0];
            $splittedMenu [$n][$j][1] = $menu[$m][1];
            $m = $m + 1; //count threw all datasets
            $j = $j + 1; // count threw all datasets from one category.
        }
    $j = 0; //counter gets resetted when the next category gets called.
    $halter = $splittedMenu [$m][2]; //go to next category
}

现在,您阵列的第一个维度将分类。第二个维度用于您的用餐,第三个维度包含不同的数据(类别名称和用餐名称)。