Как правильно подставить значения в таблицу БД MySQL?
Есть запрос:
SELECT af_id, SUM(COALESCE(amount_value,0))*0.1 sum_pair_10
FROM (SELECT arur.af_id,
arur.r_w_uid,
@row_num := CASE WHEN @row_num_val = af_id THEN @row_num+1
WHEN (@row_num_val := af_id) IS NOT NULL THEN 1
END pair_flag,
@lag_r_w_uid := CASE WHEN (@row_num_val = af_id) AND @row_num mod 2 = 1 THEN r_w_uid
ELSE @lag_r_w_uid
END r_w_uid_1
FROM arur, u_af, (SELECT @row_num := null, @row_num_val := null, @lag_r_w_uid := null) AS x
WHERE u_af.id = arur.af_id
ORDER BY af_id, r_w_uid) t1 LEFT JOIN orders o ON (o.uid IN (t1.r_w_uid,t1.r_w_uid_1)
AND o.status = 'Completed')
WHERE pair_flag mod 2 = 0
GROUP BY af_id
HAVING COUNT(DISTINCT r_w_uid) > 5
Как вставить результаты этого запроса в таблицу MYSQL?
Пробую так, но понятно что это неправильно.
INSERT INTO five_pair
SELECT
null,
CONCAT('Бонус за:', ' ', GROUP_CONCAT(arur.r_w_uid здесь перечисляются все за кого бонус , ',')),
arur.af_id для кого бонус,
sum_pair_10 сумма бонуса из подзапроса,
'RUB',
now(),
0
FROM (SELECT af_id, SUM(COALESCE(amount_value,0))*0.1 sum_pair_10
FROM (SELECT arur.af_id,
arur.r_w_uid,
@row_num := CASE WHEN @row_num_val = af_id THEN @row_num+1
WHEN (@row_num_val := af_id) IS NOT NULL THEN 1
END pair_flag,
@lag_r_w_uid := CASE WHEN (@row_num_val = af_id) AND @row_num mod 2 = 1 THEN r_w_uid
ELSE @lag_r_w_uid
END r_w_uid_1
FROM arur, u_af, (SELECT @row_num := null, @row_num_val := null, @lag_r_w_uid := null) AS x
WHERE u_af.id = arur.af_id
ORDER BY af_id, r_w_uid) t1 LEFT JOIN orders o ON (o.uid IN (t1.r_w_uid,t1.r_w_uid_1)
AND o.status = 'Completed')
WHERE pair_flag mod 2 = 0
GROUP BY af_id
HAVING COUNT(DISTINCT r_w_uid) > 3 ts, arur
Таблицы с кодом можно посмотреть по этой ссылке: fiddle
Помогите, пожалуйста, сделать вставку правильно. Заранее спасибо.
Ответы (1 шт):
При выполнении запроса на добавление выводится ошибка
Data too long for column 'description' at row 87
Отключаем вставку, добавляем вывод длины получившегося значения fiddle - и видим, что результат имеет длину 424, тогда как поле определено как VARCHAR(400). Следует ли удивляться, что "не лезет"?
Однако просмотр результата заставляет спросить - а зачем ДВЕ запятые в качестве разделителя-то? Если хватит одной - то всё поместится, ибо длина поля в результате станет всего лишь 324:
INSERT INTO five_pair
SELECT
null,
CONCAT('Бонус за:', ' ', GROUP_CONCAT(arur.r_w_uid)) description,
arur.af_id,
sum_pair_10,
'RUB',
now(),
0
FROM (select af_id, sum(coalesce(amount_value,0))*0.1 sum_pair_10
from (
select
arur.af_id,
arur.r_w_uid,
lag(arur.r_w_uid) over (partition by arur.af_id order by arur.r_w_uid) r_w_uid_1
,row_number() OVER (partition by arur.af_id order by arur.r_w_uid ) mod 2 pair_flag
from arur, u_af
where u_af.id = arur.af_id ) t1 left join orders o on (o.uid in (t1.r_w_uid,t1.r_w_uid_1) and o.status = 'Completed')
where pair_flag = 0
group by af_id
having count(distinct r_w_uid) > 3) ts, arur;
и вставка выполнится без проблем fiddle.
PS. Но пока что настоятельно рекомендую Вам обязательно указывать поля для вставки, т.е.
INSERT INTO five_pair (id, description, p_id, amount, currency, date, status)
PPS1. Поле id можно убрать - и из списка вставки, и из набора значений.
PPS2. Для поля date в структуре таблицы указано DEFAULT CURRENT_TIMESTAMP, это поле также можно убрать. fiddle. В принципе, и status тоже можно убрать - ибо подставляемое значение такое же, как и дефолтное.