Разделите наборы данных по категориям и посчитайте наборы данных в этих категориях в 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

0

Решение

Вам нужно 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

Другие решения

Мое решение теперь, когда я упорядочиваю наборы данных по их категориям. Если я 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
}

Теперь ваше первое измерение массива разделяет категории. Второе измерение относится к вашей еде, а в третьем хранятся разные данные (название категории и название еды).

0

По вопросам рекламы [email protected]