Сумма уникальных товаров, купленных пользователем [решено]

Всем привет. Делаю подробную статистику по заказам.
Сейчас уже есть: сумма всех покупок, количество покупок, количество уникальных покупок (разных товаров)

Работает вот так:

[[!pdoUsers?
        &groups=`Users`
        &limit=`50`
        &tpl=`row`
        &leftJoin=`{ "msOrder": { "class": "msOrder","on": "modUser.id = msOrder.user_id" },
                    "msOrderProduct": { "class": "msOrderProduct","on": "msOrder.id = msOrderProduct.order_id" },
                    "msProduct": { "class": "msProduct","on": "msOrderProduct.product_id = msProduct.id" },
                    "msProductData": { "class": "msProductData","on": "msOrderProduct.product_id = msProductData.id" }
                    }`
        &select=`{
                "modUser": "*",
                "msOrder": "SUM(msOrderProduct.cost) as sum",
                "msOrderProduct": "SUM(msOrderProduct.count) as counts, COUNT(DISTINCT msOrderProduct.product_id) as unicounts", 
                "msProduct": "*",
                "msProductData": "*"
                }`
        &where=`{ "msOrder.status:IN":[1,3] }`
        &showLog=`1`
    ]]


Никак не могу придумать, как посчитать сумму уникальных товаров, буду благодарен за любые идеи
vrm13
25 января 2019, 14:36
modx.pro
810
0
Поблагодарить автора Отправить деньги

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

vrm13
25 января 2019, 16:44
0
Добавил в select
GROUP_CONCAT(DISTINCT msOrderProduct.product_id) as allprod
и создал сниппет unisum
<?php
$ids = explode(',', $input);
$products = $modx->getCollection('msProduct', [
	'id:IN' => $ids
]);

if ($products) {
$prices = [];
foreach ($products as $product) {
        $prices[] = $product->get('price');
}

$sumprice = array_sum($prices);
echo $sumprice;

}
вызываю в таблице статистики
{$allprod | unisum}
хммм, заработало конечно, но что-то медленно грузится, смотрю через debug ёмаё 1000 запросов…
думаю дальше
    vrm13
    26 января 2019, 14:22
    1
    0
    Случайно наткнулся на урок от Василия и вот что получилось:

    <?php
    $ids = explode(',', $input);
    $q = $modx->newQuery('msProductData', array('id:IN' => $ids));
    $q->limit(0);
    
    $q->prepare();
    $q->stmt->execute();
    $res = $q->stmt->fetchAll(PDO::FETCH_ASSOC);
    foreach ($res as $v) {
        $all = $v['msProductData_price'];
        $c.= str_replace(".00", ",", "$all");
    }
    $arr = explode(',', $c);
    for($i=1;$i<sizeof($arr);++$i) { 
       $arr[0] += $arr[$i];
    }
    echo $arr[0];
    теперь {$allprod | unisum} справляется в 1 запрос. какая-то магия. Я мало что понял, но кажется работает
      vrm13
      09 февраля 2019, 17:19
      0
      В лог вылезала ошибка «A non-numeric value encountered» оказывается в php 7.1 нужно добавить (int)
      $arr[0] += (int)$arr[$i];
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    3