[英]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.