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

在PHP/MySQL中,按类别拆分数据集,并统计这些类别中的数据集,php,mysql,arrays,split,Php,Mysql,Arrays,Split,我有菜单。每顿饭都有一个类别,比如牛肉、猪肉、鸡肉、沙拉。现在,我要取出每顿饭,根据类别将它们拆分,并将它们保存在一个数组中。因此,我为每个类别提供了一个包含膳食的数组。最后一步是计算每类食物的数量,但当我在那里时,这很容易 我目前的尝试非常糟糕。我做了一个mysql\u查询,每个类别都有一个过滤器,然后用一秒钟来计算数据集。所以我有一个第二类的查询。如果最后有30个类别,服务器必须为一个页面视图处理60个查询 for($i=0; $i < $30; $i++) { $fetchM

我有菜单。每顿饭都有一个类别,比如牛肉、猪肉、鸡肉、沙拉。现在,我要取出每顿饭,根据类别将它们拆分,并将它们保存在一个数组中。因此,我为每个类别提供了一个包含膳食的数组。最后一步是计算每类食物的数量,但当我在那里时,这很容易

我目前的尝试非常糟糕。我做了一个
mysql\u查询
,每个类别都有一个过滤器,然后用一秒钟来计算数据集。所以我有一个第二类的查询。如果最后有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]'");
}
等等

现在我想为每个类别创建数组:

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

您需要按您的类别进行排序。比如:

SELECT * FROM menu
ORDER BY categorie, name
然后可以将这些内容读入PHP数组。另一种方法是,为了便于按类别分组,可以这样做:

SELECT DISTINCT categorie FROM menu
然后在结果上循环并每次执行此操作:

SELECT * FROM menu WHERE categorie = $categorie
就我个人而言,我会做第一个,因为你可以抓取类别,然后将项目推送到一个数组中,因此:

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

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

我的解决方案是,现在我按数据集的类别对其排序。如果I
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; 
}
现在是棘手的部分。将第一个类别保存在holder变量中。并为稍后在
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; 
}
然后你做一个for循环,这个循环和你拥有的类别一样长(你在开始的时候得到了数字)。然后,只要holder变量和category相等,就在数组中进行
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
}
$m=0//每个数据集的计数器
$j=0//类别中数据集的计数器
$holder=$menu[$m][0]//保存实际/下一个类别
$splittedMenu=array();
对于($n=0;$n<$NumberOfCategories;$n++)//每个公司数三个
{
while($menu[$m][2]=$halter)//测试类别是否仍然相同。
{
$splittedMenu[$n][$j][0]=$menu[$m][0];
$splittedMenu[$n][$j][1]=$menu[$m][1];
$m=$m+1;//计数抛出了所有数据集
$j=$j+1;//count从一个类别中抛出所有数据集。
}
$j=0;//当调用下一个类别时,计数器被重置。
$halter=$splittedMenu[$m][2];//转到下一个类别
}

现在,数组的第一个维度将类别分开。第二个维度是您的膳食,第三个维度是您持有的不同数据(类别名称和膳食名称)。

请阅读如何正确提问sql问题。。。我们需要更多的信息一顿饭只能属于一个类别吗?如果你有分类(鸡肉,沙拉),鸡肉沙拉属于什么?不,它不能。每顿饭只有一个类别。谢谢你的回答。因为我是一个初学者,所以我必须多了解一点这些函数。希望这样行。我想我知道该怎么办了。您的第一个方法应该可以在另一个循环中使用while循环。谢谢明天必须测试,因为这里已经凌晨0点11分了。没问题,让我知道你进展如何。顺便说一句,如果您想为每个类别添加更多信息,将其拆分为自己的类别将是一个很好的方法。然后,您将在
菜单
类别
之间加入…将其拆分为自己的表,我的意思是
:)
。明白了。再次感谢您的帮助:)稍后将发布我的解决方案。