Всем здравствуйте. Подскажите, пожалуйста, как сформировать запрос к БД для следующего? Есть 2 таблицы. 1) uap_mlm_relations со столбцами id, affiliate_id и parent_affiliate_id 2) uap_referrals со столбцами affiliate_id, description, amount, currency, status Если в таблице uap_mlm_relations в столбце parent_affiliate_id встречается значение из столбца id 2 раза (пара), то добавить в таблицу uap_referrals в столбец affiliate_id это значение, в столбец description текст "За пару (значение из таблицы uap_mlm_relations столбца affiliate_id) и (значение из таблицы uap_mlm_relations столбца affiliate_id)", в столбец amount 1000.00, в столбец currency вписать RUB, а в столбец status 2. Значение может встречаться любое количество раз, и за пары, за которые уже начислялось, больше не начисляется. Как-то сложно это объяснять. Попробовала картинку нарисовать. Может так будет кому-то понятнее. Заранее спасибо.
По сути получается надо получить дерево по пользователю и чётное число в каждом узле будет означать ко-во пар, а там уже сумма ко-во пар. Так на примерку
Да, именно. Я просто не знала как сформулировать правильно. Только я не понимаю как это в запрос оформить.
Если бы я могла решить эту проблему, то темы бы этой не было. Нет у меня решения. Я не знаю как это делать, поэтому и спрашиваю.
Короче, @Ирина Гущина, вы хотите начислять призовые баллы (в денежном измерении) за двух или более приведённых клиентов. Верно? Для учёта кто кого привёл у вас заведена таблицы с древовидной структурой Код (Text): mlm_relations (id, affiliate_id, parent_affiliate_id) Для учёта призовых баллов у вас заведена таблица Код (Text): referrals (affiliate_id, description, amount, currency, status) Вы хотите чтобы на основании данных из первой таблицы для каждого участника заполнялась сумма баллов amount во второй таблице. * Из описания не ясно надо ли учитывать рефералов второго и более уровня или только непосредственных "наследников". * Не ясно надо ли вам вести учёт в реальном времени или достаточно периодически, раз в день например, расчитывать баллы. * Не ясно учтено ли здесь "целевое действие". Кажется это модель CPA и начислять деньги просто за факт прихода по реферальной ссылке значит стать посмешищем и разориться. Решение "в лоб" без учёта описанных выше сомнений: предполагаю, что есть что-то вроде моделей Laravel Eloquent с описанными связями PHP: foreach (Relation::withCount('children')->get() as $r) { $prize = floor($r->children_count / 2) * 1000; Referral::firstOrCreate( ['affilate_id' => $r->affilate_id], ['amount' => $prize, 'currency' => 'RUB', 'status' => 2] ); } даже если у вас не Laravel, это годный читабельный шаблон для отображения на вашу библиотеку доступа к БД.
Если надо решение на голом SQL, то будет примерно так: Код (SQL): INSERT INTO referrals(`affilate_id`, `amount`, `currency`, `status`) SELECT * FROM ( SELECT `affilate_id`, (FLOOR(COUNT(*) / 2) * 1000) AS `amount`, 'RUB' AS `currency`, 2 AS `status` FROM relations GROUP BY `parent_affilate_id` ) AS t ON DUPLICATE KEY UPDATE `amount` = t.`amount`, `currency` = t.`currency`, `status` = t.`status`
Извините, пожалуйста, за то что не сумела правильно описать вопрос. Исправляюсь. Начислять призовые баллы за каждую пару человек. Соответственно, человек (ID) находящийся в одной паре не может находиться в другой. Т.е. пары уникальны. Только непосредственных наследников. Желательно в реальном времени. Штука в том что там будет действовать какая-то оплата за вход, соответственно с этой оплаты и будет начисляться бонус. Извините, ещё раз. Спасибо, за то что откликнулись.
Какая пирамида? Где Вы здесь увидели её не зная всей картины в целом? Люди покупают товары и за это получают вознаграждение. Без разницы финансовое или бонусами. Если так рассуждать, то любой магазин или провайдер дающий клиенту бонус за друга или повторную покупку тоже являются пирамидами)
@Valick это обычная практика и для интернет-магазинов, и для банков. Вопрос в качестве реализации, от маркетинга до программирования. Тинькофф: "приведи двух друзей и получи месяц бесплатного РКО". DigitalOcean: "заплатим $10 за каждого друга, кто потратит от $25 за наши услуги". Всех в тюрьму?
Код сейчас такой: Код (Text): INSERT INTO uap_referrals(`affiliate_id`, `amount`, `status`,`visit_id`, `description`, `source`, `reference`, `reference_details`, `parent_referral_id`, `child_referral_id`) SELECT * FROM ( SELECT `parent_affiliate_id`, (FLOOR(COUNT(*) / 2) * 1000) AS `amount`, 2 AS `status`, 0 AS `visit_id`, 'Бонус за пару' AS `description`, 'bonus' AS `source`, 0 AS `reference`, 'Bonus' AS `reference_details`, 0 AS `parent_referral_id`, 0 AS `child_referral_id` FROM uap_relations GROUP BY `parent_affiliate_id` ) AS t ON DUPLICATE KEY UPDATE `amount` = t.`amount`, `status` = t.`status`, `visit_id` = t.`visit_id`, `description` = t.`description`, `source` = t.`source`, `reference` = t.`reference`, `reference_details` = t.`reference_details`, `parent_referral_id` = t.`parent_referral_id`, `child_referral_id` = t.`child_referral_id` Он срабатывает, но считает при каждом запуске все пары подряд. И те за которые начислено и те за которые ещё не начислялось. А надо чтобы начислялось за каждую пару только один раз. Мне тут немного подсказали что нужно сделать чтобы всё работало правильно, но я не смогу сама это кодом написать. Вот что сказали: "Обновление второй таблицы по факту выполнения некоего условия при вставке в первую в запросе INSERT не выполнить. Или SP, или триггер... и в случае триггера необходима отдельная таблица учёта уже обработанных ранее пар. Делайте вставку в процедуре. Вставляете запись. Потом, если она вставилась, смотрите количество записей для только что вставленного папашки. Если оно чётно - кидаете ему тыщу на счёт и плюс один в количества, иначе обойдётся одним инкрементом." Сможете мне с этим помочь? Сколько это будет стоить?
Вслепую не могу сказать. Если вы собираете систему вот так, с миру по нитке, то там "всё сложно" наверное. Если готовы к расходам — оставьте в личке телефон/скайп, поговорим.
Любые банковские операции сопряжены с транзакциями. Ирина, вы хотя бы слово такое слышали? Создаётся впечатление, что вы лезете туда, куда вам совсем не стоит лезть, банально не понимая всей сложности ситуации. Если надо начислять один раз, значит информацию в таблице надо помечать, что бы она не участвовала в последующих выборках.
@Valick, она готова заплатить. Не нужно людей судить, если они понимают и просят помощь за вознаграждение