Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> ООП программирование + mysql + производительность, требуеться совет что почитать что поизучать
docentovich  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 32
Пользователь №: 42772
На форуме: 8 месяцев, 3 дня
Карма:




В предыстории к проблеме: я начинающий ООПшник, много чего не знаю много чего не понимаю. Свой вопрос я гуглю уже больше недели, по сему принял решение написать сюда. Буду благодарен как за отсылку к материалам так и за прямой ответ. Наверное у меня еще не четко сформулировался вопрос, по этому я не могу найти ответ=))

Итак. есть предположим две таблички в БД

admins:

id | name
0 | Петя
1 | Вася

sale:

id | a_id | date | payment
0 | 0 | 2016-01-01 | 1000
0 | 0 | 2016-01-01 | 1500
0 | 1 | 2016-01-01 | 1000
0 | 1 | 2016-01-01 | 1200
0 | 0 | 2016-01-02 | 1000

как видно у админа за день может быть много продаж. или не быть совсем.

Задача:
Вывести табличкой по оси Y админы по оси X дни месяца (все даты за месяц). В пересечении столбцов сумма.

Как реализовано:
Есть модель под названием например Sale, в ней я получаю табличку с админыми далее я делаю джойню выборку из таблиц продаж сгруппированную по админам и дням и возвращаю как массив.


SELECT a.id aid, a.name name,
GROUP_CONCAT(s.date_pements SEPARATOR '||') date_pements //получаем выывод для админа Петя: 2016-01-01^2500||2016-01-0^1000
FROM admins a
LEFT JOIN // мне нужно вывести всех админов, не важно были ли у них продажы или нет
(
SELECT a_aid,
CONCAT_WS('^', date, SUM(payment)) date_pements //это я делаю чтобы когда я буду разлеплять массив я четко понимал к какой дате относиться платеж
FROM sale
WHERE date between 2016-01-01 and 2016-01-31
GROUP BY date
) s ON s.a_id = a.a_id
GROUP BY aid

Запрос не проверял, надюсь все верно, так как у меня еще там много чего (админы в дереве лежат, + часы + еще много много чего). после все это надо разлепить ессесвенно.
получаеться мега запросище.

А душа просит простых решений по типу:
foreach($admins as $admin){
$admin->date('2016-01-01')->peyment
}

Как это реализовать я где то смутно предпологаю. но это влечет за собой подобное обращение к БД:

SELECT SUM(payment) FROM sale WHERE a_aid = 0 AND date = '2016-01-01'

Что приводит примерно к 10 000 запорсов к БД. (админов много, много дней и еще по мимо поалт есть куища вского говна котрое надо вывести). Что ООЧЕНЬ медленно отрабатывает.

Вопрос:

1)Как реализовать подобную структру:

foreach($admins as $admin){
$admin->date('2016-01-01')->peyment
}

Но чтобы например у меня не шло обращение к БД а даннные подцеплялись из заранее выбранных массивов тоесть яделаю так

SELECT date, a_aid, payment FROM sale WHERE date between 2016-01-01 and 2016-01-31

а далее уже из этой выборки подцепляю нужные данные. По моему разумению это довольно быстро будет отрабатывать.

2) как это сделать еще таким образом чтобы у меня была не одна модель sale а две модели admins и sale. я так понимаю что мне надо копать в сторону изучаения active records но как то они не уложаться в моей голове. куда смотреть?

Это сообщение отредактировал docentovich - 2.06.2016 - 15:17
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Игорь_Vasinsky  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Лысый и злой
******

Профиль
Журнал
Группа: ★ЛжеЭксперт★
Завсегдатай форума
Сообщений: 25982
Пользователь №: 21350
На форуме: 6 лет, 8 месяцев, 20 дней
Карма: 725

Не курю:
1 год, 2 месяца, 7 дней


в чём вопрос то? как нарисовать график или как правильно составить запрос?

Цитата
я начинающий ООПшник

бывает, потом отпустит.


--------------------
Халявные ответы кончились.
Если нужен готовый код - готовьтесь заплатить.
Райкин тоже был артист

Возле дома был сарай
А когда всё хорошо
Можно просто покурить

user posted image
http://ufa102.xyz/
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
docentovich  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 32
Пользователь №: 42772
На форуме: 8 месяцев, 3 дня
Карма:




я раньше времени отпарвил пост. вопрос дописал
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
docentovich  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 32
Пользователь №: 42772
На форуме: 8 месяцев, 3 дня
Карма:




Прошу прощения за опечатки. В упор не вижу кнопку редактировать....
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
docentovich  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 32
Пользователь №: 42772
На форуме: 8 месяцев, 3 дня
Карма:




тоесть как сформировать

foreach($admins as $admin){
$admin->date('2016-01-01')->peyment
}

с помощью конструктора запросов я понимаю. но это повлечет к падению производительности из за увеличение в тысячи раз кол-ва запросов к бд.

я хочу чтобы подключалось две модели. admin и sale при иницализации первая выбирала всех админов, вторая выбирала все продажы за месяц (итого два запроса к бд), но как дальше наладить связь админа->день(промежуточная модель что ли нужна тут?)->оплата я не разумею.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
docentovich  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 32
Пользователь №: 42772
На форуме: 8 месяцев, 3 дня
Карма:




И еще хочу чтобы это было абстрактоно, чтобы я мог применить эту схему в другом месте кода=)))
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
docentovich  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 32
Пользователь №: 42772
На форуме: 8 месяцев, 3 дня
Карма:




или так:

foreach($admins as $admin){
$admin->peyment(['date'=>'2016-01-01]);
}
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
docentovich  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 32
Пользователь №: 42772
На форуме: 8 месяцев, 3 дня
Карма:




а в другом компоненте может быть использовано вот так:

foreach($peyments as $peyment){
$peyment->admin->name;
}

например
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Ответ в темуСоздание новой темыСоздание опроса