簡體   English   中英

MySQL和PHP foreach中的行總數

[英]MySQL & PHP Sum of rows in foreach

我試圖連續獲取鍛煉的總和,然后按總和對所有行進行排序,以獲取團隊所處的位置,並以正確的順序列出其中。 我現在想弄清楚我自己的邏輯已經迷失了一些。 我了解MYSQL sum函數,但似乎看不到在這種情況下如何使用它來幫助我。

所以像這樣: 例

這是我當前的Table模式:

CREATE TABLE workouts
(
team_id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
username VarChar(255) NOT NULL,
team_name VarChar(50) NOT NULL,
week1 INT NOT NULL,
week2 INT NOT NULL,
week3 INT NOT NULL,
week4 INT NOT NULL,
week5 INT NOT NULL,
week6 INT NOT NULL,
week7 INT NOT NULL,
week8 INT NOT NULL,
week9 INT NOT NULL,
week10 INT NOT NULL,
week11 INT NOT NULL,
week12 INT NOT NULL
) engine=innodb;

到目前為止,這是我的顯示:

<?php 
$count = 0;
$statement = $db->query('SELECT * FROM workouts');
foreach($statement as $row):
?>
<tr>
<td><?php $count++; ?></td>
<td><?php $row['team_name']; ?></td>
<td><?php $row['week1']; ?></td>
<td><?php $row['week2']; ?></td>
<td><?php $row['week3']; ?></td>
<td><?php $row['week4']; ?></td>
<td><?php $row['week5']; ?></td>
<td><?php $row['week6']; ?></td>
<td><?php $row['week7']; ?></td>
<td><?php $row['week8']; ?></td>
<td><?php $row['week9']; ?></td>
<td><?php $row['week10']; ?></td>
<td><?php $row['week11']; ?></td>
<td><?php $row['week12']; ?></td>
<td><?php  ?></td>
</tr>
<?php endforeach; ?>

那么,基於您已經必須對行進行匯總的最簡單答案是:

<?php 
$count = 0;
$statement = $db->query('SELECT * FROM workouts');
foreach($statement as $row):
?>
<tr>
<td><?php echo $count++; ?></td>
<td><?php echo $row['team_name']; ?></td>
<td><?php echo $row['week1']; ?></td>
<td><?php echo $row['week2']; ?></td>
<td><?php echo $row['week3']; ?></td>
<td><?php echo $row['week4']; ?></td>
<td><?php echo $row['week5']; ?></td>
<td><?php echo $row['week6']; ?></td>
<td><?php echo $row['week7']; ?></td>
<td><?php echo $row['week8']; ?></td>
<td><?php echo $row['week9']; ?></td>
<td><?php echo $row['week10']; ?></td>
<td><?php echo $row['week11']; ?></td>
<td><?php echo $row['week12']; ?></td>
<td><?php echo $row['week1'] + $row['week2'] + $row['week3'] + $row['week4'] + $row['week5'] + $row['week6'] + $row['week7'] + $row['week8'] + $row['week9'] + $row['week10'] + $row['week11'] + $row['week12']; ?></td>
</tr>
<?php endforeach; ?>

但是,為了使用該值來控制行的顯示順序,您將需要MySQL才能為您完成這項工作。

您將要做的是這樣的:

<?php 

  $count = 0;
  $statement = $db->query('
    SELECT *, week1 + week2 + week3 + week4 + week5 + week6 + week7 + week8 + week9 + week10 + week11 + week12 AS Total
    FROM workouts
    ORDER BY Total
  ');
  foreach ($statement as $row):
?>
<tr>
<td><?php echo $count++; ?></td>
<td><?php echo $row['team_name']; ?></td>
<td><?php echo $row['week1']; ?></td>
<td><?php echo $row['week2']; ?></td>
<td><?php echo $row['week3']; ?></td>
<td><?php echo $row['week4']; ?></td>
<td><?php echo $row['week5']; ?></td>
<td><?php echo $row['week6']; ?></td>
<td><?php echo $row['week7']; ?></td>
<td><?php echo $row['week8']; ?></td>
<td><?php echo $row['week9']; ?></td>
<td><?php echo $row['week10']; ?></td>
<td><?php echo $row['week11']; ?></td>
<td><?php echo $row['week12']; ?></td>
<td><?php echo $row['Total']; ?></td>
</tr>
<?php endforeach; ?>

我會將其作為SQL的一部分,而不是PHP。 與其使用Sum()來設計整個分組序列中的一列,而不必使用Sum() ,而是將這些列相加並為其分配別名“總計”,如下所示:

SELECT week1 + week2 + week3 + weekN Total FROM workouts ORDER BY Total 

這是我的解決方案。

我不只是在處理它們時回顯數據庫值,而是將它們轉儲到關聯數組中,其中以鍛煉的總數為關鍵。 然后,您可以使用kso​​rt對它們進行排序。 完成后,您可以使用foreach循環打印出陣列。

我沒有輸入完整的數組函數,但它應該給您一個想法。

<?php
$count = 0;

$statement = $db->query('SELECT * FROM workouts');

$workouts = array();

while ($row = mysql_fetch_array($statement)) {

    $total = 0;

    for($i = 0;$i < 13; $i++)
        $total = $total + $row['week'.$i];

    //Build the array containing each teams workouts
    $workouts[$total] = array('team_name' => $row['team_name'],'week1' => $row['week1']);
}

ksort($workouts);

$rowcount = 0;

foreach ($workouts as $total => $team): ?>
    <tr>
    <td><?php echo $rowcount++; ?></td>
    <td><?php echo $team['team_name']; ?></td>
    <td><?php echo $team['week1']; ?></td>
    <td><?php echo $team['week2']; ?></td>
    <td><?php echo $team['week3']; ?></td>
    <td><?php echo $team['week4']; ?></td>
    <td><?php echo $team['week5']; ?></td>
    <td><?php echo $team['week6']; ?></td>
    <td><?php echo $team['week7']; ?></td>
    <td><?php echo $team['week8']; ?></td>
    <td><?php echo $team['week9']; ?></td>
    <td><?php echo $team['week10']; ?></td>
    <td><?php echo $team['week11']; ?></td>
    <td><?php echo $team['week12']; ?></td>
    <td><?php echo $total  ?></td>
    </tr>
<?php endforeach ?>

如果我理解正確,則您希望團隊按順序排列,每個團隊中的用戶(也許按他們自己的順序)。

要獲得團隊訂單,您需要加入。

with wo as (select wo.*,
                   (week1 + week2 + . . . weekn) as weektotal
            from workouts
           )
select wo.*
from wo join
     (select team_id, sum(weektotal) as weektotal
      from wo
      group by team_id
     ) wot
     on wo.team_id = wot.team_id
order by wot.weektotal desc, wot.team_id, wo.weektotal desc

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM