PHP/SQL - 如果 foreach() 中的 ID 相同,则将值相加
Posted
技术标签:
【中文标题】PHP/SQL - 如果 foreach() 中的 ID 相同,则将值相加【英文标题】:PHP/SQL - Add values together if ID is the same in foreach() 【发布时间】:2014-04-03 13:45:07 【问题描述】:我正在尝试显示球员得分的统计数据,但是有时同一球员会以相同的 playerID 添加到数据库中,当球员被添加两次时,我如何将这些值相加以显示为总数,而不是重复播放器两次。
db结构示例:
playerID | Goals | Season | leagueID
1 5 1 1
2 1 1 1
1 2 1 2
5 3 1 1
1 3 2 2
2 2 2 1
php:
$query = $db->query('SELECT * FROM playerstats ORDER BY goals DESC LIMIT 30');
$num = $query->num_rows;
if($num > 0)
foreach($query as $row)
$playerID = $row['playerID'];
$goals = $row['goals'];
echo '
<tr>
<td>'.$playerID.'</td>
<td>'.$goals.'</td>
</tr>
';
这将分别显示 playerID 1、3 次。 如何让它只显示一次 playerID 1 并将所有目标加在一起 (10)
我尝试将查询更改为:SELECT DISTINCT * FROM playerstats ORDER BY goal DESC LIMIT 30 但这没有任何区别。
【问题讨论】:
【参考方案1】:Group BY 将帮助您:
<?php
$query = $db->query('SELECT SUM(p.goals) as total_goals,
p.playerID, p.leagueID, p.Season
FROM playerstats as p
GROUP BY p.playerID, p.leagueID, p.Season
ORDER BY total_goals DESC LIMIT 30');
$num = $query->num_rows;
if($num > 0)
foreach($query as $row)
echo '
<tr>
<td>'.$row['playerID'].'</td>
<td>'.$row['total_goals'].'</td>
</tr>
';
请注意,我的查询也将按赛季和联赛分组,如果您想要通过赛季和联赛的总进球数,您的 group by
将是:
GROUP BY p.playerID
【讨论】:
【参考方案2】:如果您只需要playerID
和goals
的总和,而不管Season
或leagueID
,请将您的查询更改为:
SELECT DISTINCT playerID AS player,
(SELECT SUM(goals) FROM playerstats WHERE playerID = player) AS totalGoals
FROM playerstats
【讨论】:
【参考方案3】:您可以将结果分组到数组中,然后循环遍历它。或在 SQL 级别排序。 这样的事情可能会起作用:
$playerStats = array();
foreach($query as $row)
if(array_key_exists($row['playerID'], $playerStats))
$playerStats[$row['playerID']] += $row['goals'];
else
$playerStats[$row['playerID']] = $row['goals'];
// Then loop over playerStats
foreach($playerStats as $playerID => $playerGoals)
echo $playerID;
echo $playerGoals;
【讨论】:
以上是关于PHP/SQL - 如果 foreach() 中的 ID 相同,则将值相加的主要内容,如果未能解决你的问题,请参考以下文章
PHP SQL SELECT sum(value) WHERE x LIKE '%$month%' (foreach)
foreach 循环中的实体验证,如果验证失败,则在下一个循环中保持失败
forEach 在 nslaoyutconstraints 中的使用