У меня есть два результата запроса один:
amount | percent
100 | 10
200 | 20
300 | 30
400 | 40
и второе это:
sales
10
20
110
120
210
220
310
320
Есть ли способ получить что-то вроде этого:
sales | percent
30 (this is sum below 100) | 10
230(this is sum between 100 and 200) | 20
430(this is sum between 200 and 300) | 30
630(this is sum between 300 and 400) | 40
я думал сделать это с PHP массивами и циклами, но я предпочитаю не отправлять много запросов на сервер. какие-либо предложения?
подзапрос будет выполнять запрос много раз, и это не хорошо
это будет лучше сделать с php
вот так (вместо запросов у меня есть массив $ first и $ second)
$first = array(
array(
'amount' => 100,
'percent' => 10
),
array(
'amount' => 200,
'percent' => 20
),
array(
'amount' => 300,
'percent' => 30
),
array(
'amount' => 400,
'percent' => 40
)
);
$second = array(
array(
'sales' => 10
),
array(
'sales' => 20
),
array(
'sales' => 110
),
array(
'sales' => 120
),
array(
'sales' => 210
),
array(
'sales' => 220
),
array(
'sales' => 310
),
array(
'sales' => 320
)
);
$result = array();
$second_len = count($second);
$s=0;
for ($i=0,$len=count($first); $i < $len; $i++) {
$sum = 0;
for (;$s < $second_len; $s++) {
if ($second[$s]['sales'] <= $first[$i]['amount']) {
$sum += $second[$s]['sales'];
} else {
break;
}
}
$result[] = array(
'sales' => $sum,
'percent' => $first[$i]['percent']
);
}
var_dump($result);
Вы говорите, что у вас есть два «результата запроса». Я предполагаю, что они приходят из таблиц. Итак, при условии, что у вас есть следующие две таблицы:
thresholds
----------
amount | percent
100 | 10
200 | 20
300 | 30
400 | 40
sales
-----
amount
10
20
110
120
210
220
310
320
Вы можете получить свои результаты с помощью этого запроса:
SELECT
SUM(sales_amount) sales
,threshold_percent percent
FROM (
SELECT
s.amount sales_amount
,t.amount threshold_amount
,t.percent threshold_percent
FROM sales s
INNER JOIN thresholds t
ON t.amount > s.amount
LEFT JOIN thresholds t2
ON t2.amount < t.amount
AND t2.amount > s.amount
WHERE t2.amount IS NULL
) sales_percents
GROUP BY threshold_amount
Вы можете проверить запрос здесь: SQLFiddle
Это должно выполняться достаточно быстро, пока у вас есть индексы на thresholds.amount
а также sales.amount
,
Сначала найдите правильный процент для каждой строки во втором наборе результатов, используя коррелированный подзапрос. Затем сгруппировать по этому:
select percent, sum(sales)
from (select q2.*,
(select q1.percent
from query1 q1
where q1.amount >= q2.sales
order by q1.amount desc
limit 1
) as percent
from query2 q2
) q
group by percent;