За последние 24 часа нас посетили 22738 программистов и 1023 робота. Сейчас ищут 649 программистов ...

Сложный запрос к БД.

Тема в разделе "MySQL", создана пользователем Ирина Гущина, 29 авг 2019.

  1. Ирина Гущина

    Ирина Гущина Новичок

    С нами с:
    8 авг 2019
    Сообщения:
    19
    Симпатии:
    0
    Всем здравствуйте.
    Подскажите, пожалуйста, как сформировать запрос к БД для следующего?
    Есть 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. Значение может встречаться любое количество раз, и за пары, за которые уже начислялось, больше не начисляется.
    Как-то сложно это объяснять. Попробовала картинку нарисовать. Может так будет кому-то понятнее. Screenshot_1.png
    Заранее спасибо.
     
  2. villiwalla

    villiwalla Активный пользователь

    С нами с:
    14 дек 2016
    Сообщения:
    471
    Симпатии:
    70
    А что вы хотите получить в конечном итоге? Пока только на уме хранимая процедура
     
    Ирина Гущина нравится это.
  3. Ирина Гущина

    Ирина Гущина Новичок

    С нами с:
    8 авг 2019
    Сообщения:
    19
    Симпатии:
    0
    Здравствуйте. Хочу чтобы при формировании пары пользователю на счёт добавлялась 1000 руб.
     
  4. villiwalla

    villiwalla Активный пользователь

    С нами с:
    14 дек 2016
    Сообщения:
    471
    Симпатии:
    70
    По сути получается надо получить дерево по пользователю и чётное число в каждом узле будет означать ко-во пар, а там уже сумма ко-во пар. Так на примерку
     
    Ирина Гущина нравится это.
  5. Ирина Гущина

    Ирина Гущина Новичок

    С нами с:
    8 авг 2019
    Сообщения:
    19
    Симпатии:
    0
    Да, именно. Я просто не знала как сформулировать правильно. Только я не понимаю как это в запрос оформить.
     
  6. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.744
    Симпатии:
    1.319
    Адрес:
    Лень
    покажи нам как ты решала проблему
     
    Ирина Гущина нравится это.
  7. Ирина Гущина

    Ирина Гущина Новичок

    С нами с:
    8 авг 2019
    Сообщения:
    19
    Симпатии:
    0
    Если бы я могла решить эту проблему, то темы бы этой не было. Нет у меня решения. Я не знаю как это делать, поэтому и спрашиваю.
     
  8. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.236
    Адрес:
    там-сям
    Проблема XY налицо.
     
    Ирина Гущина и Valick нравится это.
  9. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.744
    Симпатии:
    1.319
    Адрес:
    Лень
    Не спрашиваю решение, а "как решала своими силами" ?
     
    Ирина Гущина нравится это.
  10. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.236
    Адрес:
    там-сям
    Короче, @Ирина Гущина, вы хотите начислять призовые баллы (в денежном измерении) за двух или более приведённых клиентов. Верно?

    Для учёта кто кого привёл у вас заведена таблицы с древовидной структурой
    Код (Text):
    1. mlm_relations (id, affiliate_id, parent_affiliate_id)
    Для учёта призовых баллов у вас заведена таблица
    Код (Text):
    1. referrals (affiliate_id, description, amount, currency, status)
    Вы хотите чтобы на основании данных из первой таблицы для каждого участника заполнялась сумма баллов amount во второй таблице.
    * Из описания не ясно надо ли учитывать рефералов второго и более уровня или только непосредственных "наследников".
    * Не ясно надо ли вам вести учёт в реальном времени или достаточно периодически, раз в день например, расчитывать баллы.
    * Не ясно учтено ли здесь "целевое действие". Кажется это модель CPA и начислять деньги просто за факт прихода по реферальной ссылке значит стать посмешищем и разориться.

    Решение "в лоб" без учёта описанных выше сомнений: предполагаю, что есть что-то вроде моделей Laravel Eloquent с описанными связями
    PHP:
    1. foreach (Relation::withCount('children')->get() as $r) {
    2.   $prize = floor($r->children_count / 2) * 1000;
    3.   Referral::firstOrCreate(
    4.     ['affilate_id' => $r->affilate_id],
    5.     ['amount' => $prize, 'currency' => 'RUB', 'status' => 2]
    6.   );
    7. }
    даже если у вас не Laravel, это годный читабельный шаблон для отображения на вашу библиотеку доступа к БД.
     
    Ирина Гущина нравится это.
  11. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.236
    Адрес:
    там-сям
    Если надо решение на голом SQL, то будет примерно так:

    Код (SQL):
    1. INSERT INTO referrals(`affilate_id`, `amount`, `currency`, `status`)
    2. SELECT *
    3. FROM (
    4.     SELECT
    5.        `affilate_id`,
    6.        (FLOOR(COUNT(*) / 2) * 1000) AS `amount`,
    7.        'RUB' AS `currency`,
    8.        2 AS `status`
    9.     FROM relations
    10.     GROUP BY `parent_affilate_id`
    11. ) AS t
    12. ON DUPLICATE KEY UPDATE
    13.    `amount` = t.`amount`,
    14.    `currency` = t.`currency`,
    15.    `status` = t.`status`
    :D
     
    Ирина Гущина нравится это.
  12. Ирина Гущина

    Ирина Гущина Новичок

    С нами с:
    8 авг 2019
    Сообщения:
    19
    Симпатии:
    0
    Извините, пожалуйста, за то что не сумела правильно описать вопрос. Исправляюсь.
    Начислять призовые баллы за каждую пару человек. Соответственно, человек (ID) находящийся в одной паре не может находиться в другой. Т.е. пары уникальны.

    Только непосредственных наследников.
    Желательно в реальном времени.
    Штука в том что там будет действовать какая-то оплата за вход, соответственно с этой оплаты и будет начисляться бонус.

    Извините, ещё раз. Спасибо, за то что откликнулись.
     
  13. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    это называется финансовая пирамида, и за это можно получить реальный срок
     
  14. Ирина Гущина

    Ирина Гущина Новичок

    С нами с:
    8 авг 2019
    Сообщения:
    19
    Симпатии:
    0
    Какая пирамида? Где Вы здесь увидели её не зная всей картины в целом? Люди покупают товары и за это получают вознаграждение. Без разницы финансовое или бонусами. Если так рассуждать, то любой магазин или провайдер дающий клиенту бонус за друга или повторную покупку тоже являются пирамидами)
     
  15. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.236
    Адрес:
    там-сям
    @Valick это обычная практика и для интернет-магазинов, и для банков. Вопрос в качестве реализации, от маркетинга до программирования.

    Тинькофф: "приведи двух друзей и получи месяц бесплатного РКО". :) DigitalOcean: "заплатим $10 за каждого друга, кто потратит от $25 за наши услуги". Всех в тюрьму? :)
     
    Ирина Гущина нравится это.
  16. Ирина Гущина

    Ирина Гущина Новичок

    С нами с:
    8 авг 2019
    Сообщения:
    19
    Симпатии:
    0
    Код сейчас такой:
    Код (Text):
    1. INSERT INTO uap_referrals(`affiliate_id`, `amount`, `status`,`visit_id`, `description`, `source`, `reference`, `reference_details`, `parent_referral_id`, `child_referral_id`)
    2. SELECT * FROM
    3. ( SELECT `parent_affiliate_id`, (FLOOR(COUNT(*) / 2) * 1000) AS `amount`,
    4. 2 AS `status`,
    5. 0 AS `visit_id`,
    6. 'Бонус за пару' AS `description`,
    7. 'bonus' AS `source`,
    8. 0 AS `reference`,
    9. 'Bonus' AS `reference_details`,
    10. 0 AS `parent_referral_id`,
    11. 0 AS `child_referral_id`
    12. FROM uap_relations GROUP BY `parent_affiliate_id` )
    13. AS t
    14. ON DUPLICATE
    15. KEY UPDATE
    16. `amount` = t.`amount`,
    17. `status` = t.`status`,
    18. `visit_id` = t.`visit_id`,
    19. `description` = t.`description`,
    20. `source` = t.`source`,
    21. `reference` = t.`reference`,
    22. `reference_details` = t.`reference_details`,
    23. `parent_referral_id` = t.`parent_referral_id`,
    24. `child_referral_id` = t.`child_referral_id`
    Он срабатывает, но считает при каждом запуске все пары подряд. И те за которые начислено и те за которые ещё не начислялось. А надо чтобы начислялось за каждую пару только один раз.
    Мне тут немного подсказали что нужно сделать чтобы всё работало правильно, но я не смогу сама это кодом написать.
    Вот что сказали:
    "Обновление второй таблицы по факту выполнения некоего условия при вставке в первую в запросе INSERT не выполнить. Или SP, или триггер... и в случае триггера необходима отдельная таблица учёта уже обработанных ранее пар.
    Делайте вставку в процедуре. Вставляете запись. Потом, если она вставилась, смотрите количество записей для только что вставленного папашки. Если оно чётно - кидаете ему тыщу на счёт и плюс один в количества, иначе обойдётся одним инкрементом."
    Сможете мне с этим помочь?
    Сколько это будет стоить?
     
  17. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.236
    Адрес:
    там-сям
    Ну вам надо было попросить того, кого цитируете ))) Зачем нам это видеть?

    $25 в час
     
  18. Ирина Гущина

    Ирина Гущина Новичок

    С нами с:
    8 авг 2019
    Сообщения:
    19
    Симпатии:
    0
    Тот человек, к сожалению, не может помочь.
    Сколько денег в сумме вы хотите?
     
  19. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.236
    Адрес:
    там-сям
    Вслепую не могу сказать. Если вы собираете систему вот так, с миру по нитке, то там "всё сложно" наверное. Если готовы к расходам — оставьте в личке телефон/скайп, поговорим.
     
  20. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    Любые банковские операции сопряжены с транзакциями. Ирина, вы хотя бы слово такое слышали? Создаётся впечатление, что вы лезете туда, куда вам совсем не стоит лезть, банально не понимая всей сложности ситуации.
    Если надо начислять один раз, значит информацию в таблице надо помечать, что бы она не участвовала в последующих выборках.
     
  21. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.744
    Симпатии:
    1.319
    Адрес:
    Лень
    @Valick, она готова заплатить. Не нужно людей судить, если они понимают и просят помощь за вознаграждение
     
    artoodetoo нравится это.
  22. villiwalla

    villiwalla Активный пользователь

    С нами с:
    14 дек 2016
    Сообщения:
    471
    Симпатии:
    70
    Топик уже в другой раздел просится