MySQL несколько строк для одного пользователя, вложенный цикл - PullRequest
0 голосов
/ 29 декабря 2011

Мой коллега собрал SQL-запрос, который выводит следующий массив:

            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 голосов
/ 05 августа 2012

Похоже, вы не установили первый $ currentUserId. И это очень помогло бы увидеть SQL, который я воссоздал, поскольку он мог иметь какое-то отношение к соединениям или как бы не был разработан SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...