Если у меня есть таблица журналы:MySQL таблицы обновления на основе результатов из другого запроса
ID Date P_id TYPE
-------------------------------
1 2016-9-1 11 adClick
2 2016-9-1 22 adComplete
3 2016-9-1 11 adClick
4 2016-9-3 22 adClick
5 2016-9-3 22 adClick
6 2016-9-1 11 adClick
7 2016-9-3 22 adComplete
8 2016-9-1 11 adClick
9 2016-9-3 11 adClick
-------------------------------
и другой отчет таблицы, имеющей ту же дату & p_id следующим образом:
ID Date P_id clicks
--------------------------------
1 2016-9-1 11
2 2016-9-3 11
3 2016-9-1 11
4 2016-9-3 11
5 2016-9-1 22
6 2016-9-1 11
5 2016-9-1 22
---------------------------------
Мне нужно MySQL запрос на распределять клики в таблице отчетов в соответствии с ключом (ДатаP_id), а если есть остаток, добавьте один случайный случай до тех пор, пока не закончите остаток с теми же клавишами:
clicks =
count of rows having (Date & P_id) in logs table
------------------- Divistion (/) -------------------
count of rows having (Date & P_id) in Report and Type is adClick
Количество для каждой группы с помощью клавиш (дата & p_id) и тип события adClick в таблице бревен:
2016-9-1 11 --- count--> 4
2016-9-1 22 --- count--> 0
2016-9-3 11 --- count--> 1
2016-9-3 22 --- count--> 2
И подсчитывать в отчете таблицы:
2016-9-1 11 --- count--> 3
2016-9-1 22 --- count--> 2
2016-9-3 11 --- count--> 2
2016-9-3 22 --- count--> 0
Так таблица будет до:
ID Date P_id clicks
--------------------------------
1 2016-9-1 11 4/3 = 1 and 1 as remainder
2 2016-9-3 11 1/2 = 0 and 1 as remainder
3 2016-9-1 11 4/3 = 1 and 1 as remainder
4 2016-9-3 11 1/2 = 0 and 1 as remainder
5 2016-9-1 22 0/2 = 0
6 2016-9-1 11 4/3 = 1 and 1 as remainder
5 2016-9-1 22 0/2 = 0
---------------------------------
Образец для более подробного объяснения, первый ряд:
2016-9-1 11 4/3
4 rows (2016-9-1 11) in logs table with type=adClick by
3 row (2016-9-1 11) in report table
Я сделал часть сохранения щелчков без остатка, так что записи с моим запросом в таблице отчета являются:
ID Date P_id clicks
--------------------------------
1 2016-9-1 11 1
2 2016-9-3 11 0
3 2016-9-1 11 1
4 2016-9-3 11 0
5 2016-9-1 22 0
6 2016-9-1 11 1
5 2016-9-1 22 0
---------------------------------
Теперь я хочу, чтобы распространить остаток - может быть, случайно - в отчет таблицы так, что сумма тех же ключей остается прежним:
ID Date P_id clicks
--------------------------------
1 2016-9-1 11 1 + 1
2 2016-9-3 11 0 + 1
3 2016-9-1 11 1
4 2016-9-3 11 0
5 2016-9-1 22 0
6 2016-9-1 11 1
5 2016-9-1 22 0
---------------------------------
поэтому сумма кликов для (2016-9-1 11) теперь 4 для обеих таблиц.
Вот запрос я использую, чтобы обновить перед использованием остатка:
UPDATE report AS r
INNER JOIN
(
SELECT DATE(ctr_date) as report_date, report.placement_id, count(*) as cnt_report, cnt_event_type
FROM report
INNER JOIN
(
SELECT DATE(ctr_date) as event_date, placement_id, SUM(event_type = 'adClick') as cnt_event_type
FROM logs
GROUP BY DATE(ctr_date),placement_id
) inner_report
ON report.date = inner_report.event_date AND report.placement_id = inner_report.placement_id
GROUP BY report.date, report.placement_id
) result_table
ON r.date = result_table.report_date AND r.placement_id= result_table.placement_id
SET r.clicks = COALESCE((cnt_event_type - MOD(cnt_event_type,cnt_report))/cnt_report ,0);
Я думал, используя тот же запрос, но с ограничением (остаточным) для тех же ключей и использования:
SET r.clicks = r.clicks + 1
Мне кажется, что это может быть проще и удобнее обслуживать либо сделать это в вашем коде, либо добавить хранимую хранимую процедуру для этого. Какой способ лучше всего зависит от вашего варианта использования. – user2120275