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

ЕСТЬ РЕШЕНИЕ ЗАКРЫТО InstantCMS 2.X
#1 21 августа 2017 в 22:23
Друзья, у меня получился такой вопрос правда не знаю как это реализовать даже правильно объяснить.

В базе есть таблица которая хранит данные спортивной команды. Например возьмем 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

  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 строки суммировать и привязать к одной?
#2 21 августа 2017 в 22:26
Это я вывожу список в команде

  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. }
а это для общего списка

  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.  
#3 21 августа 2017 в 22:40
  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;
}
#5 21 августа 2017 в 23:02


php.net/manual/ru/function.array-sum.php

Ris

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

  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;
#6 21 августа 2017 в 23:05


php.net/manual/ru/function.array-sum.php

Ris

  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++; } ?>
Вот суммирую в шаблоне
#7 21 августа 2017 в 23:21
Суть вроде понимаю, но в структуру таблиц въехать не могу. array-sum — это не то. Можно, конечно, но это извращение. Суммировать нужно прямо в запросе sql.

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

  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.  
#8 21 августа 2017 в 23:27

array-sum — это не то. Можно, конечно, но это извращение.

@SmartControl
Но это быстрее, чем select('SUM(u.points)'
И по памяти и на практике. Хотя, если таблица небольшая — все равно.
Я экспериментировал с таблицей в два миллиона строк.
#9 21 августа 2017 в 23:42


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

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

  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.  

@SmartControl

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

вот код
  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. }
#10 21 августа 2017 в 23:50


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

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

  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.  

@SmartControl

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

  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. }
#11 22 августа 2017 в 07:39
  1. $this->orderBy('t_points', 'desc');
#12 22 августа 2017 в 10:08

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

Нико

Сортировка то не по очкам должна быть, а по сумме. То есть так:
  1. $this->orderBy('SUM(u.points)', 'desc');

Но это быстрее, чем select('SUM(u.points)'
И по памяти и на практике. Хотя, если таблица небольшая — все равно.
Я экспериментировал с таблицей в два миллиона строк.

Ris

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

Но когда дело касается огромных баз данных, тут уже логика может быть другая — бесполезно спорить, может в какой-то ситуации пришлось бы писать по-другому… Но в самом простом случае суммирование и группировка прямо в запросе выглядят самыми логичными и понятными.
#13 22 августа 2017 в 11:25


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

Нико

Сортировка то не по очкам должна быть, а по сумме. То есть так:
  1. $this->orderBy('SUM(u.points)', 'desc');

Но это быстрее, чем select('SUM(u.points)'
И по памяти и на практике. Хотя, если таблица небольшая — все равно.
Я экспериментировал с таблицей в два миллиона строк.

Ris

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

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

@SmartControl

  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. }
Так не сортирует ничего не происходит.
#14 22 августа 2017 в 11:36

Так не сортирует ничего не происходит.

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

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

  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 запрос. А там уже становится понятней что и как…
#15 22 августа 2017 в 11:41


Так не сортирует ничего не происходит.

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

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

  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 запрос. А там уже становится понятней что и как..

@SmartControl
Да спасибо отлично как видите сработало, но я уже давно пытаюсь сделать числа

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



  1. <tbody>
  2. <?php $i = 1; foreach($tournament_in_team['tournament_in_teams'] as $tournament_in) {
  3. $lost = $tournament_in['play']-$tournament_in['win'];
  4. $pts = $tournament_in['play'] / $tournament_in['points'];
  5. $points[] = $tournament_in['points']; // Заносим очки в массив
  6. $win[] = $tournament_in['win']; // Заносим очки в массив
  7. $play[] = $tournament_in['play']; // Заносим очки в массив
  8. $loser[] = $lost; // Заносим очки в массив
  9. $pts_avg[] = $pts; // Заносим очки в массив
  10.  
  11. ?>
  12.  
  13. <tr style="font-size: 12px;">
  14. <td class="field ft_caption f_title"><?php echo $i;?></td>
  15. <td class="field ft_caption f_title"><a href="<?php echo $this->href_to('sport', $tournament_in['id']); ?>" class="title"><?php html($tournament_in['t_name']); ?></a></td>
  16. <td class="field ft_caption f_title"><?php html($tournament_in['t_location']); ?></td>
  17. <td class="field ft_caption f_title"><?php html($tournament_in['t_date']); ?></td>
  18. <td class="field ft_caption f_title"><?php html($tournament_in['rating']); ?></td>
  19.  
  20.  
  21. <td class="field ft_caption f_title"><?php if ($tournament_in['play']==! NULL) { echo $tournament_in['play']; } else { ?>0<?php } ?></td>
  22. <td class="field ft_caption f_title"><?php if ($tournament_in['win']==! NULL) { echo $tournament_in['win']; } else { ?>0<?php } ?></td>
  23. <td class="field ft_caption f_title"><?php echo $lost; ?></td>
  24. <td><?php $avg = $tournament_in['points'] / $tournament_in['play']; echo floor($avg); ?></td>
  25. <td class="field ft_caption f_title"><?php if ($tournament_in['points']==! NULL) { echo $tournament_in['points']; } else { ?>0<?php } ?></td>
  26. <td><?php $pro = $tournament_in['win'] * 100 / $tournament_in['play']; echo floor($pro); ?></td>
  27. </tr>
  28. <?php $i++; } ?>
  29. </tbody>
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.