簡體   English   中英

在PHP / MySQL中將數據集划分為類別,並對這些類別中的數據集進行計數

[英]Split datasets in categories, and count the datasets within these categories, in PHP/MySQL

我有菜單。 每頓飯都包括牛肉,豬肉,雞肉,沙拉。 現在,我想獲取每頓飯,根據類別將它們分開,並保存在數組中。 因此,對於每個類別,我都有一個包含餐點的數組。 最后一步是計算每個類別中的進餐數量,但是當我在那里時,這很容易。

我目前的嘗試非常糟糕。 我用一個過濾器針對每個類別創建一個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

您需要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次的查詢並不一定是壞事。 請記住,最重要的是總運行時間,而不是查詢數。 有時,將一個問題分解成幾個較小的查詢比執行一個大查詢更快。

現在,我的解決方案是按類別對數據集進行排序。 如果我與結果相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循環中將需要它。

然后,您將創建一個for循環,該循環與您擁有的多個類別一樣長(開頭是Number)。 之后,只要您的holder變量和類別相等,就可以在數組中進行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
}

現在,數組的第一個維度將類別分開。 第二個維度適用於您的餐點,第三個維度包含不同的數據(類別名稱和餐點名稱)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM