Задача - вывести все категории, чтоб напротив их названия в дужках было указано по количество элементов этой же категории….при этом использовав как можно меньше запросов дабы оптимизировать и ускорить процесс обработки….
….я никогда раньше с этим не стыкался, и вот оно меня страшно заинтересовало)…
И собсно говоря за пару часов..(или меньше) наконец родил алгоритм….
…он правда прост до изнемождения…..но беда вся заключается в том шо там столько запросов уходит, сколько и присутствуют категорий в данной бд….еще плюс один(чтоб узнать количество категорий)…
итак - структура бд..
table Category
—————————–
catid | catname
—————————–
1 | category1
2 | category2
3 | category3
—————————–
думаю этого для демонстрации достаточно
и елементы, принадлежащей той или иной категории….
table Items
———————————————-
ItemId | ItemName | CatID
———————————————-
1 | item1 | 2
2 | item2 | 2
3 | item3 | 3
4 | item4 | 2
5 | item5 | 1
6 | item6 | 1
7 | item7 | 1
———————————————–
(мда, и все же хреново шо почемуто у меня теги таблицы не фурычат…ну меньше с тем)
Итак….дальше привожу сам код….
// подключается и выбырается бд
require_once "db.class.php";
$db = new db();
$query = "SELECT catname FROM Сategory ORDER BY catid ASC";
$resCat = mysql_query($query);
$COUNT = mysql_num_rows($resCat);// количество строк можно получить
//любым образом, не суть важно)
$array = array();
for($i=1;$i<=$COUNT;$i++)
{
$res = mysql_query("SELECT * FROM Items
LEFT JOIN Category ON Items.CatId = Category.catid
WHERE Items.CatId = {$i}");
$amount = mysql_num_rows($res);
while($CATEGORY = mysql_fetch_assoc($res))
{
$array[$CATEGORY['catname']] = $amount;
}
}
echo "<pre>";
print_r($array);
echo "</pre>";
собсно говоря на выходе у нас массив, ключи у которого - имена категорий а его елементы(значения) - количество елементов для каждой категории…
по - другому, как это сделать мне в голову ничего не лезет….я подумал сначала намутить шото с использованием зранений древовидных структур(например в форме нестед сетс), но там еще бредовее ситуация бы выглядила…..если бы вообще выглядела)…
Итого - у нас три категории - вроде как три запроса…….
в реальных задачах - конечно что больше….например 73…..
тоесть выходит что надо задавать 73 запроса и + 1 чтоб узнать количество всех категорий….
….Можно ли както сократить количество запросов…..или по какомуто другому методу оптимизировать это все)?…..