Как сумировать массив и вывести в другом экшене ? 2.X

 
Посетитель
small user social cms
Медаль
Сообщений: 624
Друзья, у меня получился такой вопрос правда не знаю как это реализовать даже правильно объяснить.

В базе есть таблица которая хранит данные спортивной команды. Например возьмем 2 команды.
A - команда
B - команда
-
Есть таблица (teams) в котором хранятся данные команды, в котором они принимали участи на чемпионате например:
id (1) - team_id (1 - это А - команда) - score (очков 10) - date (05.05.2017)
id (2) - team_id (1 - это А - команда) - score (очков 5) - date (05.06.2017)

На странице команды sports/team/1 (это страница команда А) я вывожу в каких турнирах участвовала а команда, а потом суммирую общее количество очков:
А - команда - очков 10 - дата 05.05.2017
А - команда - очков 5 - дата 05.06.2017

Код PHP:
  1. array_sum($score)
- Общие очки 15

Все это работает, теперь вопрос в том что есть страница главная - sport/teams/1 (тут все команды) например
Команда А
Команда Б
Команда В

Мне нужно как то сумировать данные что бы было так:

Команда А - 15 очков
Команда Б - 23 очка.
И т.д

Тоесть взять данные из одной таблица суммировать очки которые принадлежать команде под одинаковыми id.
таблица tournament таблица team
team_id (1) score (10) id 1 (Команда А
team_id (1) score (5)

Как эти 2 строки суммировать и привязать к одной ?
Посетитель
small user social cms
Медаль
Сообщений: 624
Это я вывожу список в команде

Код PHP:
  1. public function getTournamentInTeam($id){
  2. $tournament_in_team = $this->getItemById('sport_teams_tournaments', $id);
  3. $this->filterEqual('teams_id', $id);
  4. $this->join('sport_tournaments', 'u', 'u.id = i.tournament_id');
  5. $this->select('u.tournament_name', 't_name');
  6. $this->select('u.location', 't_location');
  7. $this->select('u.date', 't_date');
  8. $this->select('u.sport', 't_sport');
  9. $this->select('u.official', 't_offcial');
  10. $this->select('u.id', 't_id');
  11. if (!$this->order_by){
  12. $this->orderBy('u.date', 'desc');
  13. }
  14. $tournament_in_team['tournament_in_teams'] = $this->get('sport_teams_tournaments');
  15. return $tournament_in_team;
  16. }
а это для общего списка

Код PHP:
  1. public function getTournamentsAllTeams($id){
  2. $this->filterEqual('tournament_id', $id); /* Фильтр тура 1 = 1 */
  3. $teams['teams_all'] = $this->get('sport_teams');
  4. return $teams;
  5. }
  6.  
Редактировалось: 1 раз (Последний: 21 августа 2017 в 22:26)
Реклама
cms
Посетитель
small user social cms
Медаль
Сообщений: 624
Код PHP:
  1. public function getTournamentsAllTeams($id){
  2. $this->filterEqual('tournament_id', $id); /* Фильтр тура 1 = 1 */
  3. $this->join('sport_teams_tournaments', 'u', 'u.teams_id = i.id');
  4. $this->select('u.points', 't_points'); если бы вот это уже в модуле получилось бы суммировать тогда думаю получится потому что он все держит много строк. Нужно все прибавить друг другу и вывести.
  5. $teams['teams_all'] = $this->get('sport_teams');
  6. return $teams;
}
Посетитель
small user social cms
МедальАвторитет форумаКубок зрительских симпатийПочетный донор проекта
Сообщений: 2657
http://php.net/manual/ru/function.array-sum.php
Посетитель
small user social cms
Медаль
Сообщений: 624

Да про это я знаю но мне надо суммировать все данные и вывести вот тут

Код PHP:
  1. public function getTournamentsAllTeams($id){
  2. $this->join('sport_teams_tournaments', 'u', 'u.teams_id = i.id');
  3. $this->select('u.points', 't_points'); тут много их нужно как то в один суммировать и вывести в одной строке. например 2+5+7+9+10 и т.д, а он в шаблоне суммирует по одному.
  4. $teams['teams_all'] = $this->get('sport_teams');
  5. return $teams;
Посетитель
small user social cms
Медаль
Сообщений: 624

Код PHP:
  1.  
  2. <?php $i = 1; foreach($teams['teams_all'] as $tournament) {
  3. $points[] = $tournament['points']; // Заносим очки в массив
  4. $score = array_sum($points); ?>
  5. <tr>
  6. <!--<td class="field ft_caption f_title"><h2><?php echo $i;?></h2></td>-->
  7. <td class="field ft_caption f_title"><?php echo $score; ?></td>
  8. </tr>
  9. <?php $i++; } ?>
Вот суммирую в шаблоне
Редактировалось: 1 раз (Последний: 21 августа 2017 в 23:05)
Посетитель
small user social cms
Медаль
Сообщений: 653
Суть вроде понимаю, но в структуру таблиц въехать не могу. array-sum - это не то. Можно, конечно, но это извращение. Суммировать нужно прямо в запросе sql.

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

Код PHP:
  1.  
  2. public function getTournamentsAllTeams($id){
  3. $teams['teams_all'] = $this->join('sport_teams_tournaments', 'u', 'u.teams_id = i.id')
  4. ->select('SUM(u.points)', 't_points') // берем не просто поле points, а суммируем его в запросе
  5. ->groupBy('u.teams_id') //группируем по полю teams_id - правильно? - если нет, поставьте свое поле или поля через запятую
  6. ->get('sport_teams');
  7. return $teams; // переменная teams не определена
  8.  
Посетитель
small user social cms
МедальАвторитет форумаКубок зрительских симпатийПочетный донор проекта
Сообщений: 2657
@SmartControl:
array-sum - это не то. Можно, конечно, но это извращение.
Но это быстрее, чем select('SUM(u.points)'
И по памяти и на практике. Хотя, если таблица небольшая - все равно.
Я экспериментировал с таблицей в два миллиона строк.
Спойлер
Редактировалось: 1 раз (Последний: 21 августа 2017 в 23:31)
Посетитель
small user social cms
Медаль
Сообщений: 624
@SmartControl:

Суть вроде понимаю, но в структуру таблиц въехать не могу. array-sum - это не то. Можно, конечно, но это извращение. Суммировать нужно прямо в запросе sql.

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

Код PHP:
  1.  
  2. public function getTournamentsAllTeams($id){
  3. $teams['teams_all'] = $this->join('sport_teams_tournaments', 'u', 'u.teams_id = i.id')
  4. ->select('SUM(u.points)', 't_points') // берем не просто поле points, а суммируем его в запросе
  5. ->groupBy('u.teams_id') //группируем по полю teams_id - правильно? - если нет, поставьте свое поле или поля через запятую
  6. ->get('sport_teams');
  7. return $teams; // переменная teams не определена
  8.  

Спасибо больше вам, все сработало!) Я думал когда писал что меня никто не поймет)

вот код
Код PHP:
  1.  
  2. public function getTournamentsAllTeams($id){
  3. $this->filterEqual('tournament_id', $id); /* Фильтр тура 1 = 1 */
  4. $this->join('sport_teams_tournaments', 'u', 'u.teams_id = i.id');
  5. $this->select('SUM(u.points)', 't_points'); // берем не просто поле points, а суммируем его в запросе
  6. $this->groupBy('u.teams_id'); //группируем по полю teams_id - правильно? - если нет, поставьте свое поле или поля через запятую
  7. $teams['teams_all'] = $this->get('sport_teams');
  8. return $teams;
  9. }
Редактировалось: 1 раз (Последний: 21 августа 2017 в 23:43)
Посетитель
small user social cms
Медаль
Сообщений: 624
@SmartControl:

Суть вроде понимаю, но в структуру таблиц въехать не могу. array-sum - это не то. Можно, конечно, но это извращение. Суммировать нужно прямо в запросе sql.

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

Код PHP:
  1.  
  2. public function getTournamentsAllTeams($id){
  3. $teams['teams_all'] = $this->join('sport_teams_tournaments', 'u', 'u.teams_id = i.id')
  4. ->select('SUM(u.points)', 't_points') // берем не просто поле points, а суммируем его в запросе
  5. ->groupBy('u.teams_id') //группируем по полю teams_id - правильно? - если нет, поставьте свое поле или поля через запятую
  6. ->get('sport_teams');
  7. return $teams; // переменная teams не определена
  8.  

Теперь не могу сделать сортировку, по points у кого больше, по какому полю надо это сделать ?

Код PHP:
  1. public function getTournamentsAllTeams($id){
  2. $this->filterEqual('tournament_id', $id); /* Фильтр тура 1 = 1 */
  3. $this->join('sport_teams_tournaments', 'u', 'u.teams_id = i.id');
  4. $this->select('SUM(u.points)', 't_points'); // берем не просто поле points, а суммируем его в запросе
  5. if (!$this->order_by){
  6. $this->orderBy('u.points', 'desc'); Вот сортировка
  7. }
  8. $this->groupBy('u.teams_id'); //группируем по полю teams_id - правильно? - если нет, поставьте свое поле или поля через запятую
  9. $teams['teams_all'] = $this->get('sport_teams');
  10. return $teams;
  11. }
Посетитель
small user social cms
МедальАвторитет форумаКубок зрительских симпатийПочетный донор проекта
Сообщений: 2657
Код PHP:
  1. $this->orderBy('t_points', 'desc');
Посетитель
small user social cms
Медаль
Сообщений: 653
Нико:
$this->orderBy('u.points', 'desc'); Вот сортировка

Сортировка то не по очкам должна быть, а по сумме. То есть так:
Код PHP:
  1. $this->orderBy('SUM(u.points)', 'desc');
Ris:
Но это быстрее, чем select('SUM(u.points)'
И по памяти и на практике. Хотя, если таблица небольшая - все равно.
Я экспериментировал с таблицей в два миллиона строк.

У меня другая практика и опыт)
Я еще в 1С 7.7 занимался прямыми запросами к БД и там был очень крутой сервер с SQL и 1Ска, которую стоило поберечь. И задача была максимально использовать ресурсы sql и не мучить 1Ску, которая на массиве в 2 миллиона строк загнулась бы.. Да и зачем выгружать эти 2 миллиона, потом обрабатывать их если можно получить сразу ответ.

Но когда дело касается огромных баз данных, тут уже логика может быть другая - бесполезно спорить, может в какой-то ситуации пришлось бы писать по-другому.. Но в самом простом случае суммирование и группировка прямо в запросе выглядят самыми логичными и понятными.
Посетитель
small user social cms
Медаль
Сообщений: 624
@SmartControl:

Нико:
$this->orderBy('u.points', 'desc'); Вот сортировка

Сортировка то не по очкам должна быть, а по сумме. То есть так:
Код PHP:
  1. $this->orderBy('SUM(u.points)', 'desc');
Ris:
Но это быстрее, чем select('SUM(u.points)'
И по памяти и на практике. Хотя, если таблица небольшая - все равно.
Я экспериментировал с таблицей в два миллиона строк.

У меня другая практика и опыт)
Я еще в 1С 7.7 занимался прямыми запросами к БД и там был очень крутой сервер с SQL и 1Ска, которую стоило поберечь. И задача была максимально использовать ресурсы sql и не мучить 1Ску, которая на массиве в 2 миллиона строк загнулась бы.. Да и зачем выгружать эти 2 миллиона, потом обрабатывать их если можно получить сразу ответ.

Но когда дело касается огромных баз данных, тут уже логика может быть другая - бесполезно спорить, может в какой-то ситуации пришлось бы писать по-другому.. Но в самом простом случае суммирование и группировка прямо в запросе выглядят самыми логичными и понятными.

Код PHP:
  1. public function getTournamentsAllTeams($id){
  2. $this->filterEqual('tournament_id', $id); /* Фильтр тура 1 = 1 */
  3. $this->join('sport_teams_tournaments', 'u', 'u.teams_id = i.id');
  4. $this->select('SUM(u.points)', 't_points'); // берем не просто поле points, а суммируем его в запросе
  5. $this->select('SUM(u.win)', 't_win'); // берем не просто поле points, а суммируем его в запросе
  6. $this->select('SUM(u.play)', 't_play'); // берем не просто поле points, а суммируем его в запросе
  7.  
  8. $this->groupBy('u.teams_id'); //группируем по полю teams_id - правильно? - если нет, поставьте свое поле или поля через запятую
  9. if (!$this->order_by){
  10. $this->orderBy('SUM(u.points)', 'desc');
  11. }
  12. $teams['teams_all'] = $this->get('sport_teams');
  13. return $teams;
  14. }
Так не сортирует ничего не происходит.
Посетитель
small user social cms
Медаль
Сообщений: 653
Нико:
Так не сортирует ничего не происходит.
Эххх, точно.. И вариант, который предложил Ris тоже работать не будет, по другой причине.

Код PHP:
  1.  
  2. public function orderBy($field, $direction='', $is_force_index_by_field = false){
  3. if(strpos($field, '(') !== false){ return $this; } // в названии поля не может быть функции
  4.  
Функцию туда запихать не получается в сортировку. Тогда чуть переписать надо.

Код PHP:
  1.  
  2. public function getTournamentsAllTeams($id){
  3. $this->filterEqual('tournament_id', $id); /* Фильтр тура 1 = 1 */
  4. $this->join('sport_teams_tournaments', 'u', 'u.teams_id = i.id');
  5. $this->select('SUM(u.points)', 't_points'); // берем не просто поле points, а суммируем его в запросе
  6. $this->select('SUM(u.win)', 't_win'); // берем не просто поле points, а суммируем его в запросе
  7. $this->select('SUM(u.play)', 't_play'); // берем не просто поле points, а суммируем его в запросе
  8.  
  9. $this->groupBy('u.teams_id'); //группируем по полю teams_id - правильно? - если нет, поставьте свое поле или поля через запятую
  10. if (!$this->order_by){
  11. $this->order_by = 'SUM(u.points) desc '; //запишем напрямую, без вызова функции
  12.  
  13. }
  14. $teams['teams_all'] = $this->get('sport_teams');
  15. return $teams;
  16. }
  17.  
Вообще в таких случаях, когда непонятно что и как работает - я добавляю логи (вывод на экран или в файл) в функцию query() в файле core/database.php. И смотрю получившийся sql запрос. А там уже становится понятней что и как..
Редактировалось: 1 раз (Последний: 22 августа 2017 в 11:36)
Посетитель
small user social cms
Медаль
Сообщений: 624
@SmartControl:

Нико:
Так не сортирует ничего не происходит.
Эххх, точно.. И вариант, который предложил Ris тоже работать не будет, по другой причине.

Код PHP:
  1.  
  2. public function orderBy($field, $direction='', $is_force_index_by_field = false){
  3. if(strpos($field, '(') !== false){ return $this; } // в названии поля не может быть функции
  4.  
Функцию туда запихать не получается в сортировку. Тогда чуть переписать надо.

Код PHP:
  1.  
  2. public function getTournamentsAllTeams($id){
  3. $this->filterEqual('tournament_id', $id); /* Фильтр тура 1 = 1 */
  4. $this->join('sport_teams_tournaments', 'u', 'u.teams_id = i.id');
  5. $this->select('SUM(u.points)', 't_points'); // берем не просто поле points, а суммируем его в запросе
  6. $this->select('SUM(u.win)', 't_win'); // берем не просто поле points, а суммируем его в запросе
  7. $this->select('SUM(u.play)', 't_play'); // берем не просто поле points, а суммируем его в запросе
  8.  
  9. $this->groupBy('u.teams_id'); //группируем по полю teams_id - правильно? - если нет, поставьте свое поле или поля через запятую
  10. if (!$this->order_by){
  11. $this->order_by = 'SUM(u.points) desc '; //запишем напрямую, без вызова функции
  12.  
  13. }
  14. $teams['teams_all'] = $this->get('sport_teams');
  15. return $teams;
  16. }
  17.  
Вообще в таких случаях, когда непонятно что и как работает - я добавляю логи (вывод на экран или в файл) в функцию query() в файле core/database.php. И смотрю получившийся sql запрос. А там уже становится понятней что и как..
Да спасибо отлично как видите сработало, но я уже давно пытаюсь сделать числа

1.
2.
3.
4. Место
И . тд
То есть слева. но так как постраничный режим каждый раз в каждой странице с вверху начинается 1,2,3,4 даже не знаю как это реализовать

Как сумировать массив и вывести в другом экшене ?

Спойлер
Редактировалось: 2 раз (Последний: 22 августа 2017 в 11:44)
В начало страницы
Предыдущая темаСледующая тема Перейти на форум: