Сумма уникальных товаров, купленных пользователем [решено]
Всем привет. Делаю подробную статистику по заказам.
Сейчас уже есть: сумма всех покупок, количество покупок, количество уникальных покупок (разных товаров)
Работает вот так:
Никак не могу придумать, как посчитать сумму уникальных товаров, буду благодарен за любые идеи
Сейчас уже есть: сумма всех покупок, количество покупок, количество уникальных покупок (разных товаров)
Работает вот так:
[[!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`
]]
Никак не могу придумать, как посчитать сумму уникальных товаров, буду благодарен за любые идеи
Поблагодарить автора
Отправить деньги
Комментарии: 3
Добавил в 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 запросов…думаю дальше
Случайно наткнулся на урок от Василия и вот что получилось:
<?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 запрос. какая-то магия. Я мало что понял, но кажется работает
В лог вылезала ошибка «A non-numeric value encountered» оказывается в php 7.1 нужно добавить (int)
$arr[0] += (int)$arr[$i];
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.