К содержанию

COUNT() в xPDO

Помогите сделать правильный запрос в базу на PDO, у меня никак не получается.

Мне нужно вывести количество тикетов из одной категории (parent), у которых тв country равен 1.
Делаю я это в цикле для всех стран. То есть для каждой итерации значение тв country будет меняться.

P.S. Пробовал по примеру тут и тут но пока ничего не выходит у меня…
Василий Столейков
Василий Столейков
16 июня 2015, 10:56
modx.pro
3 455
Реклама

Комментарии: 18

Василий Столейков
Василий Столейков Проверенный
16 июня 2015, 14:07
1. Как я понимаю нужно джойнить 2 таблицы, modx_site_content и modx_tmplvar_contentvalues? Как это правильно сделать?
2. Забыл сказать, что тикетов оооооочень много. То есть где-то около 140000. Но в одной категории (parent) тикетов максимум 80000 (я буду по parent выбирать). Возможно ли вывести количество по странам (тв country), не положив при этом сервер?
    Василий Столейков
    Василий Столейков Проверенный
    16 июня 2015, 14:36
    Исходя из количества тикетов, как решить проблему с выводом тикетов через mFilter2, т.к. сейчас выводится следующая ошибка:
    Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 72 bytes) in /home/*****/www/core/components/msearch2/model/msearch2/filters.class.php on line 57
    Сайт на modhost.pro.

    Вызов mFilter2:
    [[!mFilter2? 
        &element=`getTickets` 
        &tpl=`tpl.blog-item`
        &includeTVs=`export_country,export_city,import_country,import_city,cargo_type,transport_type,face,phone,skype,email`
        &limit=`5`
        &sortby=`publishedon`
        &parents=`35` 
        &filters=`
            tv|export_country,
            tv|export_city,
            tv|import_country,
            tv|import_city,
            tv|cargo_type,
            tv|transport_type
        `
    ]]
      Василий Столейков
      Василий Столейков Проверенный
      16 июня 2015, 17:56
      Увеличил тариф на Максимальный и проблема решилась.
        Василий Наумкин
        Василий Наумкин Администратор
        16 июня 2015, 18:34
        512 MB memory_limit вместо 128 — конечно решилась =)
          Василий Столейков
          Василий Столейков Проверенный
          16 июня 2015, 20:33
          Ага, зато я теперь довольный как слон! Похоже такой раздутый сайт нужно оставлять на Максимальном тарифе )))
            Василий Наумкин
            Василий Наумкин Администратор
            16 июня 2015, 20:49
            Если хочешь фильтровать кучу документов, то конечно. Они же все собираются в массивы, которые занимают память, и потом по ним уже идёт работа.

            Чем больше данных, тем больше массивы и тем больше нужно памяти — иначе никак.
      Николай
      Николай Проверенный
      16 июня 2015, 14:54
      del
        Василий Столейков
        Василий Столейков Проверенный
        16 июня 2015, 14:57
        del
        Не совсем понял.
          Николай
          Николай Проверенный
          16 июня 2015, 15:02
          Я вначале спросил, а потом нашел ответ, в письме на почте можете увидеть оригинал сообщения.
        Николай
        Николай Проверенный
        16 июня 2015, 15:02
        Мое личное мнение — xPDO тут нафиг не нужен. Все более чем элементарно:
        1. Создаем сниппет count, код которого ниже:
        $q = $modx->prepre("SELECT COUNT(*) FROM `modx_site_tmplvar_contentvalues` WHERE `tmplvarid` = '1' AND `value` = '$country'");
        $q->execute();
        return $q->fetchColumn();
        Из которого tmplvarid это ИД TV (Я надеюсь где его найти знаете?)
        Ну и собственно вызов сниппета будет
        [[!count? &country=`1`]]
        Все.
          Василий Столейков
          Василий Столейков Проверенный
          16 июня 2015, 16:26
          Я почему спрашивал, потому что нужно выбрать не общее число указаний стран, а именно у тикетов, у которых parent=37 например. Так как есть несколько категорий (секций) тикетов. Тут нужно или джойнить или что-то ещё.
            Николай
            Николай Проверенный
            16 июня 2015, 16:33
            Мне нужно вывести количество тикетов, у которых тв country равен 1.
            Как можно заметить, в исходном вопросе отсутствует условие, при котором имеется parent.
            Василий Столейков
            Василий Столейков Проверенный
            17 июня 2015, 16:16
            Твой вариант классный, спасибо! Но у меня не получилось его прикрутить к моей задаче…

            Как придумать логику, чтобы были подсчитаны количество тикетов отдельной категории (по parent), у которых значение тв country = 1 например?

            Разве что перебором, или запуском в моём сниппете сниппета pdoResources с критерием выборки? (кстати, нужно будет потестить этот вариант, но в цикле прийдётся его запустить отдельно для 230 стран...)

            Нету больше никаких мыслей, как связать всё это одним запросом, чтобы поменьше циклов всяких было?
            Fi1osof
            Fi1osof Эксперт
            18 июня 2015, 10:24
            $q = $modx->newQuery('TicketsClass');
            $q->innerJoin('TVClass', "TVAlias", "TVAlias.tmplvarid = {$tv_id} AND TVAlias.ticket_id = TicketsClass.id");
            $q->select(array(
            	"count(*)",
            	"TVAlias.value"
            ));
            $q->groupby(2);
            $q->sortby(1, "DESC");
            $s = $q->prepare();
            $s->execute();
            $rows = $s->fetchAll(PDO::FETCH_ASSOC);
            И этому всему ресурсов практически не нужно.
              Василий Столейков
              Василий Столейков Проверенный
              18 июня 2015, 10:27
              Классно, спасибо тебе большое! Именно такой ответ я и искал! Иду приспосабливать его к своей задаче!
                Fi1osof
                Fi1osof Эксперт
                18 июня 2015, 10:29
                На самом деле подобное надо искать на форумах по MySQL, а не по MODX. Здесь xPDO — Только инструмент. Но он нужен только для составления SQL-запроса. Если нет понимания какой именно и как запрос составить — то не составишь. Поэтому прокачивай SQL. Это на самом деле простейший запрос.
                  Василий Столейков
                  Василий Столейков Проверенный
                  18 июня 2015, 10:34
                  ок, так и делаю изо всех сил. Спасибо!
                    Fi1osof
                    Fi1osof Эксперт
                    18 июня 2015, 10:34
                    Пожалуйста!
              Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
              18