COUNT() в xPDO

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

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

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

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

Василий Столейков
16 июня 2015, 14:07
0
1. Как я понимаю нужно джойнить 2 таблицы, modx_site_content и modx_tmplvar_contentvalues? Как это правильно сделать?
2. Забыл сказать, что тикетов оооооочень много. То есть где-то около 140000. Но в одной категории (parent) тикетов максимум 80000 (я буду по parent выбирать). Возможно ли вывести количество по странам (тв country), не положив при этом сервер?
    Василий Столейков
    16 июня 2015, 14:36
    0
    Исходя из количества тикетов, как решить проблему с выводом тикетов через 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
      0
      Увеличил тариф на Максимальный и проблема решилась.
        Василий Наумкин
        16 июня 2015, 18:34
        0
        512 MB memory_limit вместо 128 — конечно решилась =)
          Василий Столейков
          16 июня 2015, 20:33
          0
          Ага, зато я теперь довольный как слон! Похоже такой раздутый сайт нужно оставлять на Максимальном тарифе )))
            Василий Наумкин
            16 июня 2015, 20:49
            0
            Если хочешь фильтровать кучу документов, то конечно. Они же все собираются в массивы, которые занимают память, и потом по ним уже идёт работа.

            Чем больше данных, тем больше массивы и тем больше нужно памяти — иначе никак.
      Николай
      16 июня 2015, 14:54
      0
      del
        Василий Столейков
        16 июня 2015, 14:57
        0
        del
        Не совсем понял.
          Николай
          16 июня 2015, 15:02
          0
          Я вначале спросил, а потом нашел ответ, в письме на почте можете увидеть оригинал сообщения.
        Николай
        16 июня 2015, 15:02
        0
        Мое личное мнение — 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
          0
          Я почему спрашивал, потому что нужно выбрать не общее число указаний стран, а именно у тикетов, у которых parent=37 например. Так как есть несколько категорий (секций) тикетов. Тут нужно или джойнить или что-то ещё.
            Николай
            16 июня 2015, 16:33
            0
            Мне нужно вывести количество тикетов, у которых тв country равен 1.
            Как можно заметить, в исходном вопросе отсутствует условие, при котором имеется parent.
            Василий Столейков
            17 июня 2015, 16:16
            0
            Твой вариант классный, спасибо! Но у меня не получилось его прикрутить к моей задаче…

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

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

            Нету больше никаких мыслей, как связать всё это одним запросом, чтобы поменьше циклов всяких было?
            Fi1osof
            18 июня 2015, 10:24
            0
            $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
              0
              Классно, спасибо тебе большое! Именно такой ответ я и искал! Иду приспосабливать его к своей задаче!
                Fi1osof
                18 июня 2015, 10:29
                +2
                На самом деле подобное надо искать на форумах по MySQL, а не по MODX. Здесь xPDO — Только инструмент. Но он нужен только для составления SQL-запроса. Если нет понимания какой именно и как запрос составить — то не составишь. Поэтому прокачивай SQL. Это на самом деле простейший запрос.
            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
            18