Кол-во обращений к базе

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
drag0n
Сообщения: 208
Зарегистрирован: 2017.04.28, 08:37

Re: Кол-во обращений к базе

Сообщение drag0n »

Alexum писал(а): 2017.07.20, 14:07
drag0n писал(а): 2017.07.20, 14:02 Не все пойму то что вы написали, есть пример?
или по подробней можете сказать?
Сперва в общих чертах поясните, что делают эти 8153 запроса.

Код: Выделить всё

1. Проверка на второй уровень (на втором уровне более подробно будет)
    1.1. Лично сам партнер купил >= 3 продукта
    1.2. Проверка товарооборота в его структуре (со всех людей в его структуре) должно быть >= 350 продукции (в общем, не у каждого)
    1.3. Должно быть под ним 5 человек которые на первом уровне (в его структуре)
          1.1.1 И у этих 5 человек должно быть по 3 продукта (у каждого)
Вот это условия для перехода на второй уровень
Последний раз редактировалось drag0n 2017.07.20, 14:36, всего редактировалось 2 раза.
drag0n
Сообщения: 208
Зарегистрирован: 2017.04.28, 08:37

Re: Кол-во обращений к базе

Сообщение drag0n »

dmg писал(а): 2017.07.20, 14:10
drag0n писал(а): 2017.07.20, 12:55
dmg писал(а): 2017.07.20, 12:45
Ясно. Не понял сразу. Возможно, в случае предполагаемого роста, имеет смысл расчёты делать после изменения данных и вести в отдельных таблицах. Или сделать view в BD.
Я уже думал, не получается
мне нужно проверить достижения каждого человека, у каждого человека свой уровень достижения
уровень1
уровень2
уровень3
уровень4
уровень5
уровень6

если он достиг уровня 2, то он переходит на уровень 2
если уровень 3, то переходит на 3

и кто муже каждый уровень зависит от предыдущего
т.е.
уровень 2 зависит от уровня 1
уровень 3 зависит от уровня 2
уровень 4 зависит от уровня 2
и т.д.

и плюс расчеты на каждом уровне меняются
:?
В чём разница раз в месяц проверять всех или при изменении у каждого?. Тем более так у вас всегда бкдет актуальная информация.
В конце месяца происходит начисление вознаграждения
Проверка сколько продукции он и его структура купила
И в зависимости от его структуры и от него самого меняется уровень квалификации
Аватара пользователя
Alexum
Сообщения: 683
Зарегистрирован: 2016.09.26, 10:00

Re: Кол-во обращений к базе

Сообщение Alexum »

drag0n писал(а): 2017.07.20, 14:24

Код: Выделить всё

1. Проверка на второй уровень (на втором уровне более подробно будет)
    1.1. Лично сам партнер купил >= 3 продукта
    1.2. Проверка товарооборота в его структуре (со всех людей в его структуре) должно быть >= 350 продукции (в общем, не у каждого)
    1.3. Должно быть под ним 5 человек которые на первом уровне (в его структуре)
          1.1.1 И у этих 5 человек должно быть по 3 продукта (у каждого)
Вот это условия для перехода на второй уровень
И для каждого из 500 пользователей вы делаете отдельный SQL запрос, чтобы это подсчитать?
drag0n
Сообщения: 208
Зарегистрирован: 2017.04.28, 08:37

Re: Кол-во обращений к базе

Сообщение drag0n »

Alexum писал(а): 2017.07.20, 14:42
drag0n писал(а): 2017.07.20, 14:24

Код: Выделить всё

1. Проверка на второй уровень (на втором уровне более подробно будет)
    1.1. Лично сам партнер купил >= 3 продукта
    1.2. Проверка товарооборота в его структуре (со всех людей в его структуре) должно быть >= 350 продукции (в общем, не у каждого)
    1.3. Должно быть под ним 5 человек которые на первом уровне (в его структуре)
          1.1.1 И у этих 5 человек должно быть по 3 продукта (у каждого)
Вот это условия для перехода на второй уровень
И для каждого из 500 пользователей вы делаете отдельный SQL запрос, чтобы это подсчитать?
Ну да,

А как выполнить эти все условия для всех пользователей одним SQL запросом, я просто не знаю
kawabanga
Сообщения: 806
Зарегистрирован: 2013.10.12, 23:35
Откуда: Новосибирск

Re: Кол-во обращений к базе

Сообщение kawabanga »

Мы тут в экстрасенсов играем.

Но вот вариант с php и группировками был же.

Как высчитывается текущий уровень? Он записан где-то?

Можно просто в упор записать длинный скрипт

Код: Выделить всё

select 
level as previous level,
IF( level=1, {условие для лвл 1, вывод ЛВЛ партнера}, 
  IF (level=2, {условия для лвл 2}, 

   IF (level=3), {Условие} ,
    ....
)
) as current_level

Или подсчитать уровень вверх:

Код: Выделить всё

update table
set level+1
where 
IF( level=1, {условие для лвл 1, вывод  ДА или НЕТ }, 
  IF (level=2, {условия для лвл 2}, 

   IF (level=3), {Условие} ,
    ....
)

)


UPD.
1. Проверка на второй уровень (на втором уровне более подробно будет)
1.1. Лично сам партнер купил >= 3 продукта
1.2. Проверка товарооборота в его структуре (со всех людей в его структуре) должно быть >= 350 продукции (в общем, не у каждого)
1.3. Должно быть под ним 5 человек которые на первом уровне (в его структуре)
1.1.1 И у этих 5 человек должно быть по 3 продукта (у каждого)
В таком случае, самый простой вариант - делаете 5 запросов на каждый уровень.
update partners a
inner join (select partner_id, count(id) as count_goods from invoice_items group by partner_id) b
on a.id=b.partner_id
inner join (select {на товарооборот}) c
on a.id=c.partner_id
set level=2
where
a.level=1
drag0n
Сообщения: 208
Зарегистрирован: 2017.04.28, 08:37

Re: Кол-во обращений к базе

Сообщение drag0n »

Код: Выделить всё

            $users = Structure::find()
                ->select(['users.id', new Expression("SUM(o.qty) as sqty")])
                ->joinWith('order o') //, 'o.user_id = users.id')
                ->where(['users.id' => $childsAll['user_ids']])
                ->andWhere(['between', 'o.created_at', $beg_date, $end_date])
                ->groupBy(id)
                ->asArray()
                ->all();
Хорошо я вывел всех пользователей, а также объединил всех пользователей с количеством заказов
но дальше все равно нужно будет пройтись по каждому пользователю и найти его первую линий (уровень)
caHek2x
Сообщения: 1242
Зарегистрирован: 2016.04.12, 20:41

Re: Кол-во обращений к базе

Сообщение caHek2x »

->groupBy(id)
что за магия ?
drag0n
Сообщения: 208
Зарегистрирован: 2017.04.28, 08:37

Re: Кол-во обращений к базе

Сообщение drag0n »

caHek2x писал(а): 2017.07.20, 18:39 ->groupBy(id)
что за магия ?
в смысле магия ???
по id группирую
в итоге получается
все пользователи с
id
sqty
caHek2x
Сообщения: 1242
Зарегистрирован: 2016.04.12, 20:41

Re: Кол-во обращений к базе

Сообщение caHek2x »

ну значит опечатка ... ибо ("id") а не (id)
caHek2x
Сообщения: 1242
Зарегистрирован: 2016.04.12, 20:41

Re: Кол-во обращений к базе

Сообщение caHek2x »

drag0n писал(а): 2017.07.20, 17:52

Код: Выделить всё

            $users = Structure::find()
                ->select(['users.id', new Expression("SUM(o.qty) as sqty")])
                ->joinWith('order o') //, 'o.user_id = users.id')
                ->where(['users.id' => $childsAll['user_ids']])
                ->andWhere(['between', 'o.created_at', $beg_date, $end_date])
                ->groupBy(id)
                ->asArray()
                ->all();
Хорошо я вывел всех пользователей, а также объединил всех пользователей с количеством заказов
но дальше все равно нужно будет пройтись по каждому пользователю и найти его первую линий (уровень)
в твоем случае насколько помню что мы когда то обсуждали нужны и те у кого нет заказов ... ?!
а запрос вернет только тех у кого есть заказы ... а тебе еще надо пользователи которые ниже стоящие (ну или хз как их правильно обозвать) ..
поэтому лучше считай всех пользователей без джойна, считай заказы по дате ...
потом пройдись по массиву с заказами и раскидай суммы на пользователей (опять же как в примере что я кидал) ... дальше пройдись по массиву пользователей и построй дерево какой от какого зависит (опять же как в примере что я кидал) ...
drag0n
Сообщения: 208
Зарегистрирован: 2017.04.28, 08:37

Re: Кол-во обращений к базе

Сообщение drag0n »

caHek2x писал(а): 2017.07.20, 19:02 ну значит опечатка ... ибо ("id") а не (id)
это вручную набирал, забыл про кавычки :)
drag0n
Сообщения: 208
Зарегистрирован: 2017.04.28, 08:37

Re: Кол-во обращений к базе

Сообщение drag0n »

caHek2x писал(а): 2017.07.20, 19:06
drag0n писал(а): 2017.07.20, 17:52

Код: Выделить всё

            $users = Structure::find()
                ->select(['users.id', new Expression("SUM(o.qty) as sqty")])
                ->joinWith('order o') //, 'o.user_id = users.id')
                ->where(['users.id' => $childsAll['user_ids']])
                ->andWhere(['between', 'o.created_at', $beg_date, $end_date])
                ->groupBy(id)
                ->asArray()
                ->all();
Хорошо я вывел всех пользователей, а также объединил всех пользователей с количеством заказов
но дальше все равно нужно будет пройтись по каждому пользователю и найти его первую линий (уровень)
в твоем случае насколько помню что мы когда то обсуждали нужны и те у кого нет заказов ... ?!
а запрос вернет только тех у кого есть заказы ... а тебе еще надо пользователи которые ниже стоящие (ну или хз как их правильно обозвать) ..
поэтому лучше считай всех пользователей без джойна, считай заказы по дате ...
потом пройдись по массиву с заказами и раскидай суммы на пользователей (опять же как в примере что я кидал) ... дальше пройдись по массиву пользователей и построй дерево какой от какого зависит (опять же как в примере что я кидал) ...
Да у кого заказов нет не выводятся, сразу не обратил внимания, спасибо
drag0n
Сообщения: 208
Зарегистрирован: 2017.04.28, 08:37

Re: Кол-во обращений к базе

Сообщение drag0n »

Кто-нибудь знает можно как-нибудь так записать
->andWhere(['>=', "SUM(o.qty)", 3])

Код: Выделить всё

                $users = Structure::find()
                    ->select(['users.id', "SUM(o.qty) as sqty"])
                    ->leftJoin('order o', 'o.user_id = users.id')
                    ->where(['users.id' => $childs1['user_ids']])
                    ->andWhere(['users.rank_id' => 1])
--->              //->andWhere(['>=', "SUM(o.qty)", 3])
                    ->andWhere(['between', 'o.created_at', $beg_date, $end_date])
                    ->groupBy("users.id")
                    ->asArray()
                    ->all();
caHek2x
Сообщения: 1242
Зарегистрирован: 2016.04.12, 20:41

Re: Кол-во обращений к базе

Сообщение caHek2x »

->andHaving(new Expression("SUM(o.qty) >= 3")
drag0n
Сообщения: 208
Зарегистрирован: 2017.04.28, 08:37

Re: Кол-во обращений к базе

Сообщение drag0n »

caHek2x писал(а): 2017.07.21, 18:40 ->andHaving(new Expression("SUM(o.qty) >= 3")
Как всегда то что надо, спасибо!
Аватара пользователя
Introvert
Сообщения: 139
Зарегистрирован: 2017.07.04, 13:42
Откуда: Украина, Киев

Re: Кол-во обращений к базе

Сообщение Introvert »

Какое количество запросов должно быть для адекватной работы сайта? К примеру это готовый блог или cms, на данный момент на простеньком сайте заявок у меня 20 запросов, это нормально? А если я допилю профиль и ещё несколько функций дойдет до 100 примерно. И вообще от чего зависит уменьшение запросов? Посоветуйте книгу что ли хорошую по запросам, как писать сложные и уменьшать нагрузку на сервер
Пишу социальную сеть заявок для фирм.
Nerf
Сообщения: 780
Зарегистрирован: 2015.01.29, 00:37

Re: Кол-во обращений к базе

Сообщение Nerf »

Introvert писал(а): 2017.07.21, 21:56 Какое количество запросов должно быть для адекватной работы сайта? К примеру это готовый блог или cms, на данный момент на простеньком сайте заявок у меня 20 запросов, это нормально? А если я допилю профиль и ещё несколько функций дойдет до 100 примерно. И вообще от чего зависит уменьшение запросов? Посоветуйте книгу что ли хорошую по запросам, как писать сложные и уменьшать нагрузку на сервер
Нет, для простенького сайта заявок количество запросов должно быть равно 7 или кратно 11.
Ответить