ФорумРазработкаБазы данных → реально ли оптимизировать запрос)))?

реально ли оптимизировать запрос)))?

  • Rotten

    Сообщения: 2243 Репутация: N Группа: Адекваты

    Spritz Фев. 6, 2009, 4:12 п.п.

    Часто нам встречаются сайты….вернее страницы на этих сайтах, где возле каждой категории продукции в дужках указано количество товаров(если это интернет-магазин)….или возле каждого названия фотоальбома в тех же дужках указано количество фотографий(если это фотогалерея какаято, соответственно))…
    Задача - вывести все категории, чтоб напротив их названия в дужках было указано по количество элементов этой же категории….при этом использовав как можно меньше запросов дабы оптимизировать и ускорить процесс обработки….
    ….я никогда раньше с этим не стыкался, и вот оно меня страшно заинтересовало)…
    И собсно говоря за пару часов..(или меньше) наконец родил алгоритм….
    …он правда прост до изнемождения…..но беда вся заключается в том шо там столько запросов уходит, сколько и присутствуют категорий в данной бд….еще плюс один(чтоб узнать количество категорий)…
    итак - структура бд..

    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 чтоб узнать количество всех категорий….
    ….Можно ли както сократить количество запросов…..или по какомуто другому методу оптимизировать это все)?…..

  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz Фев. 6, 2009, 4:28 п.п., спустя 16 минут

    вас бы в армию (с) эдворд.
    Сапожник без сапог
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz Фев. 6, 2009, 4:31 п.п., спустя 2 минуты 22 секунды

    –categories
    catid | catname

    –items
    itemid | catid | name


    select
        `c`.*,COUNT(`i`.*)
    from
        `categories` as `c`
    INNER JOIN
        `items` as `i` ON `i`.`catid`=`c`.`catid`
    GROUP BY `c`.`catid`


    нечто такое надо делать

    зы: синтаксис не проверял. так что если описался или ошибся слегка не приябываться
    Сапожник без сапог
  • Rotten

    Сообщения: 2243 Репутация: N Группа: Адекваты

    Spritz Фев. 6, 2009, 6:37 п.п., спустя 2 часа 5 минут 54 секунды

    )))….не знаю к чему фишка эта…..но, я так понял ты сразу хочешь выбрать и количество и название….т.е. не используя mysql_num_rows отдельно)…..
    и иннер джоин…из измененной структурой 2й таблицы(смена местами 2х полей)))…..тут я какбы разницы не вижу…..всюда где не читал мануалы - на примерах был лефт джоин………..
    иннер джоин разве шо для того шоб тупо все поля не выбирать……
    …..да, кстати….а ошыбку то выдало, но меньше с тем, намек понят….
    спасибо, как бы там не было)
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz Фев. 6, 2009, 6:38 п.п., спустя 1 минуту 38 секунд

    иннер джоин разве шо для того шоб тупо все поля не выбирать……
    для этого моск используется а не иннер жойн
    Сапожник без сапог
  • Rotten

    Сообщения: 2243 Репутация: N Группа: Адекваты

    Spritz Фев. 6, 2009, 6:45 п.п., спустя 6 минут 21 секунду

    ну да…….через запятую…то понятно)…
    но просто смысла не увидел менять лефт на иннер жойн)

Пожалуйста, авторизуйтесь, чтобы написать комментарий!