一个用户的mysql多行,嵌套循环

时间:2011-12-29 16:44:22

标签: php mysql loops nested

我的同事已经整理了一个输出以下数组的SQL select:

            Array
            (
                                    [0] => Array
                                            (
                                    [total_completion_time] => 163
                                    [promotion_id] => 1
                                    [challenge_id] => 1
                                    [userId] => 2
                                    [display_name] => laxadmin
                                    [completion_time] => 163
                                    [completion_time_mins] => 0
                                    [completion_time_secs] => 0
                                    [completion_time_mmss] => 0:0
                                    [score] => 40
            )

    [1] => Array
            (
                                    [total_completion_time] => 345
                                    [promotion_id] => 1
                                    [challenge_id] => 1
                                    [userId] => 1
                                    [display_name] => siteadmin
                                    [completion_time] => 345
                                    [completion_time_mins] => 5
                                    [completion_time_secs] => 45
                                    [completion_time_mmss] => 5:45
                                    [score] => 50
            )

    [2] => Array
            (
                                    [total_completion_time] => 345
                                    [promotion_id] => 1
                                    [challenge_id] => 1
                                    [userId] => 3
                                    [display_name] => mdeville
                                    [completion_time] => 345
                                    [completion_time_mins] => 0
                                    [completion_time_secs] => 0
                                    [completion_time_mmss] => 0:0
                                    [score] => 0
            )

    [3] => Array
            (
                                    [total_completion_time] => 943
                                    [promotion_id] => 1
                                    [challenge_id] => 1
                                    [userId] => 4
                                    [display_name] => Matthew DeVille
                                    [completion_time] => 163
                                    [completion_time_mins] => 2
                                    [completion_time_secs] => 43
                                    [completion_time_mmss] => 2:43
                                    [score] => 90
            )

    [4] => Array
            (
                                    [total_completion_time] => 943
                                    [promotion_id] => 1
                                    [challenge_id] => 3
                                    [userId] => 4
                                    [display_name] => Matthew DeVille
                                    [completion_time] => 90
                                    [completion_time_mins] => 1
                                    [completion_time_secs] => 30
                                    [completion_time_mmss] => 1:30
                                    [score] => 30
            )

    [5] => Array
            (
                                    [total_completion_time] => 943
                                    [promotion_id] => 1
                                    [challenge_id] => 4
                                    [userId] => 4
                                    [display_name] => Matthew DeVille
                                    [completion_time] => 90
                                    [completion_time_mins] => 1
                                    [completion_time_secs] => 30
                                    [completion_time_mmss] => 1:30
                                    [score] => 35
            )

    [6] => Array
            (
                                    [total_completion_time] => 943
                                    [promotion_id] => 1
                                    [challenge_id] => 5
                                    [userId] => 4
                                    [display_name] => Matthew DeVille
                                    [completion_time] => 300
                                    [completion_time_mins] => 5
                                    [completion_time_secs] => 0
                                    [completion_time_mmss] => 5:0
                                    [score] => 30
            )

    [7] => Array
            (
                                    [total_completion_time] => 943
                                    [promotion_id] => 1
                                    [challenge_id] => 6
                                    [userId] => 4
                                    [display_name] => Matthew DeVille
                                    [completion_time] => 300
                                    [completion_time_mins] => 5
                                    [completion_time_secs] => 0
                                    [completion_time_mmss] => 5:0
                                    [score] => 20
            )

他还提供了以下代码来循环结果并创建一个包含以下标题的表:

用户| 挑战1次| 挑战2次| 挑战3次| 挑战4次| 挑战5次| 挑战6次| 挑战7次| 总时间|

<?php
for ($x=0; $x < $results_length; $x++) {
    $row = $results[$x]; // get next row from results
    $userId = $row["userId"]; // get userId from row

    // by default, we'll expect to continue to build UI display for current user
    $beginNewUserDisplay = false;

    if ($userId !== $currentUserId) {
        // if not first user, we need to close the current table row
        if ($currentUserId != -1) {
        // if we haven't filled in one table cell for each possible result
            // do that now...
            while ($challengesCtr <= $TOTAL_CHALLENGES_CT) {
                // this means we're missing results we need
                // to properly display the table so we add in blank cells
                echo "<td></td>";
                $challengesCtr = $challengesCtr+1;
            }

            // display total time
            // TODO: verify this is the correct display value
            echo "<td>".$row["total_completion_time"]. "-" .$row['userId']."</td>";
            echo "</tr>";
        }

    // Regardless, we need to start a new table row
    // no more results for previous user, starting UI display for new user
    $currentUserId = $userId;
    $beginNewUserDisplay = true;

    // reset the results counter
    $challengesCtr = 1;

    }



    if ($beginNewUserDisplay == true) {
        // start UI for new User's results
        echo "<tr>";
        echo "<td>".$row['userId']."</td>";
        echo "<td>".$row['display_name']. "-" .$row['userId']."</td>";  
    } else {
        // continue UI for current User's results
        $challengeId = $row["challenge_id"];
        while ($challengesCtr < $challengeId) {
            // if this executes it means we're missing results
            // we need to properly display the table so we add in blank cells
            echo "<td></td>";
            $challengesCtr = $challengesCtr+1;
        }

        // echo table cell current challenge time here
        // TODO: verify this is the correct display value
        echo "<td>".$row['completion_time_mmss']."</td>";

        // increment our results counter
        $challengesCtr = $challengesCtr+1;
    }

}
?>

问题是循环正在跳过大多数第一个用户的数据,而且表中缺少最后两列。

您可以在此处查看结果:http://65.242.11.205/leaderboard/

我通常可以找出嵌套的循环,但是这个让我瘫痪了。

1 个答案:

答案 0 :(得分:0)

好像你没有设置第一个$ currentUserId。它有助于看到SQL I recon,因为它可能与连接有关,或者SQL是设计的。