在PHP中结合几个循环MySQL查询

时间:2012-04-18 19:29:56

标签: php mysql loops

我有两张与琐事测验游戏的这一部分有关的表:scoresquiz。我已经嵌套了许多PHP和MySQL循环,我希望有一种更优雅的方式(希望更少的数据库查询)来实现相同的结果。

任何建议都非常感谢。

下面是我的MySQL结构,PHP代码和一些示例数据。

quiz包含系统中每个测验的信息,每个测验一个记录:

  `uid` int(11) NOT NULL AUTO_INCREMENT,
  `category_uid` int(11) NOT NULL,
  `name` varchar(255) NOT NULL,
  `sample` binary(2) NOT NULL,
  `difficulty` varchar(65) NOT NULL,
  `date_created` datetime NOT NULL,
  `date_updated` datetime NOT NULL,
  PRIMARY KEY (`uid`)

唯一ID,categories表格地图(此处不相关),名称,是否为样本测验,难度等级,首次创建日期以及最后日期更新。

表格scores包含用户参加测验时的结果,测验中每个问题一条记录(因此,10个问题测验中有10行):

  `uid` int(11) NOT NULL AUTO_INCREMENT,
  `unique_uid` varchar(255) NOT NULL,
  `question_uid` int(11) NOT NULL,
  `quiz_uid` int(11) NOT NULL,
  `user_uid` int(11) NOT NULL,
  `answer` varchar(255) NOT NULL,
  `correct` binary(2) NOT NULL,
  `points` int(25) NOT NULL,
  `time` float(20,1) NOT NULL,
  `date_created` datetime NOT NULL,
  PRIMARY KEY (`uid`)

记录的唯一ID,正在进行的测验实例的唯一ID,questions表格的地图(此处不相关),quiz表的地图,地图users表(此处不相关),给出的答案,是否正确,获得的分数,响应所用的秒数,以及记录的时间戳。

由于玩家可以重新玩测验,每个scores.unique_uid指向一次玩测验。这意味着玩家可以在五个不同的时间玩quiz.uid = 1,这意味着五个不同的score.unique_uid总共(5次X 10个问题=)50行记录在scores表中。 / p>

我要做的是检索所有不同的scores.unique_uid记录(玩家得分的每个测验的列表),然后查看每组10条记录的一些列表结果(一个测验, 10个问题)。

我现在的做法是:

  1. 循环查询,返回玩家已获得的每个唯一quiz.uid
  2. 循环浏览另一个查询,该查询会针对该特定测验评分的玩家的每个唯一实例返回scores.unique_uid quiz.uid
  3. 使用第三个查询检索具有唯一scores.unique_uid的每组记录的SUM()数据(我无法与DISTINCT查询成功结合)
  4. 这是我的PHP代码:

    // Query retrieves each unique quiz the player has taken
    $ss = sqlQuery("SELECT DISTINCT scores.quiz_uid, quiz.difficulty, quiz.name FROM scores, quiz WHERE scores.user_uid = {$_SESSION['uid']} AND quiz.uid = scores.quiz_uid ORDER BY scores.date_created DESC");
    if ( mysql_num_rows( $ss ) > 0 ) {
        while ( $row = mysql_fetch_assoc( $ss ) ){  
            /* Step through each quiz and output name and difficulty */
    ?>
    <h2><?php echo ( $row['name'] ); ?> <span><small>Difficulty: <?php echo( $row['difficulty'] ); ?></small></span></h2>
    <?php
            // Query retrieves each unique unique_uid scored (each instance of every quiz)
            $eqs = sqlQuery("SELECT DISTINCT unique_uid FROM scores WHERE quiz_uid = {$row['quiz_uid']} AND user_uid = {$_SESSION['uid']}");
    
            while ( $eqsrow = mysql_fetch_assoc( $eqs ) ){
                /* Step through each quiz played instance, and output score and other details */
    
                // Query retrieves SUM()s for total time, total points, total correct responses
                $euqs = sqlQuery('SELECT date_created, ' . 
                    'SUM(time) AS times, SUM(points) AS points, SUM(correct) AS ttlcorrect ' .
                    "FROM scores WHERE unique_uid = {$eqsrow['unique_uid']} AND user_uid = {$_SESSION['uid']} ");
    
                // Output the score
                while ( $euqsrow = @mysql_fetch_assoc( $euqs ) ){
    ?>
    <div class="row">
    <span class="score"><?php echo( number_format( $euqsrow['points'], 0) ); ?> points</span>
    <span class="time"><?php echo( number_format( $euqsrow['times'], 0) ); ?> seconds</span>
    <span class="correct"><?php echo( number_format( $euqsrow['ttlcorrect'], 0) ); ?> / 10 correct</span>
    <span class="date">Played <?php echo( date( 'F j, Y', strtotime($euqsrow['date_created']) ) ); ?></span>
    </div>
    <?php
                } // Close euqs while()
            } // close $eqs while()
        } // close $ss while()
    } // close if()
    

    以下是每个表的一些示例记录。

    测验表:

    (uid, category_uid, name, sample, difficulty, date_created, date_updated)
    (1, 1, 'Business and Industry', '\0\0', 'Newcomer', '2012-03-15 13:42:30', '2012-03-15 13:42:30'),
    (2, 2, 'History', '\0\0', 'Newcomer', '2012-03-15 13:42:30', '2012-03-15 13:42:30'),
    (3, 3, 'Sports', '\0\0', 'Newcomer', '2012-03-15 13:42:50', '2012-03-15 13:42:50'),
    (4, 4, 'Arts/Entertainment', '\0\0', 'Newcomer', '2012-03-15 13:42:50', '2012-03-15 13:42:50'),
    (5, 5, 'Music', '\0\0', 'Newcomer', '2012-03-15 13:43:11', '2012-03-15 13:43:11'),
    (6, 6, 'Geography', '\0\0', 'Newcomer', '2012-03-15 13:43:11', '2012-03-15 13:43:11');
    

    得分表:

    (uid, unique_uid, question_uid, quiz_uid, user_uid, answer, correct, points, time, date_created)
    (81, '1111334693628', 4, 1, 11, 'Paul''s Valley', '0\0', 0, 2.8, '2012-04-17 13:15:40'),
    (82, '1111334693628', 6, 1, 11, 'Bartlesville', '1\0', 9, 2.4, '2012-04-17 13:15:44'),
    (83, '1111334693628', 3, 1, 11, 'Shawnee', '1\0', 8, 5.9, '2012-04-17 13:15:51'),
    (84, '1111334693628', 40, 1, 11, 'Cimarron Turnpike', '0\0', 0, 4.4, '2012-04-17 13:15:57'),
    (85, '1111334693628', 1, 1, 11, 'tow package for trucks', '1\0', 9, 3.9, '2012-04-17 13:16:03'),
    (86, '1111334693628', 36, 1, 11, 'aviation', '1\0', 6, 9.0, '2012-04-17 13:16:13'),
    (87, '1111334693628', 37, 1, 11, 'Altus', '0\0', 0, 3.0, '2012-04-17 13:16:18'),
    (88, '1111334693628', 2, 1, 11, 'Bama Pies', '1\0', 7, 6.1, '2012-04-17 13:16:25'),
    (89, '1111334693628', 5, 1, 11, 'Gordon Cooper', '0\0', 0, 2.2, '2012-04-17 13:16:29'),
    (90, '1111334693628', 38, 1, 11, 'Bartlesville', '1\0', 9, 2.7, '2012-04-17 13:16:33'),
    (91, '1131334773558', 13, 3, 11, 'Jim Thorpe', '1\0', 10, 1.5, '2012-04-18 11:26:09'),
    (92, '1131334773558', 49, 3, 11, 'Henry Iba', '1\0', 10, 1.8, '2012-04-18 11:26:12'),
    (93, '1131334773558', 17, 3, 11, 'Kelli Litsch', '1\0', 10, 1.9, '2012-04-18 11:26:15'),
    (94, '1131334773558', 14, 3, 11, 'Bud Wilkinson', '0\0', 0, 4.4, '2012-04-18 11:26:21'),
    (95, '1131334773558', 48, 3, 11, 'Charlie Coe', '1\0', 10, 1.7, '2012-04-18 11:26:25'),
    (96, '1131334773558', 50, 3, 11, 'Jim Tatum', '1\0', 8, 4.3, '2012-04-18 11:26:31'),
    (97, '1131334773558', 47, 3, 11, 'Bobby Murcer', '0\0', 0, 2.4, '2012-04-18 11:26:34'),
    (98, '1131334773558', 15, 3, 11, 'Myron Roderick', '1\0', 9, 3.1, '2012-04-18 11:26:39'),
    (99, '1131334773558', 46, 3, 11, 'Tommy McDonald', '1\0', 9, 3.6, '2012-04-18 11:26:44'),
    (100, '1131334773558', 16, 3, 11, 'five', '0\0', 0, 2.0, '2012-04-18 11:26:48'),
    (101, '1131334773620', 15, 3, 11, 'Myron Roderick', '1\0', 9, 2.4, '2012-04-18 11:27:16'),
    (102, '1131334773620', 13, 3, 11, 'Jim Thorpe', '1\0', 10, 1.1, '2012-04-18 11:27:18'),
    (103, '1131334773620', 49, 3, 11, 'Henry Iba', '1\0', 10, 1.3, '2012-04-18 11:27:21'),
    (104, '1131334773620', 16, 3, 11, 'seven', '1\0', 10, 1.8, '2012-04-18 11:27:25'),
    (105, '1131334773620', 46, 3, 11, 'Tommy McDonald', '1\0', 10, 1.4, '2012-04-18 11:27:28'),
    (106, '1131334773620', 47, 3, 11, 'Darrell Porter', '1\0', 10, 1.8, '2012-04-18 11:27:31'),
    (107, '1131334773620', 50, 3, 11, 'Jim Tatum', '1\0', 9, 2.2, '2012-04-18 11:27:35'),
    (108, '1131334773620', 14, 3, 11, 'Benny Owen', '1\0', 9, 2.7, '2012-04-18 11:27:39'),
    (109, '1131334773620', 17, 3, 11, 'Kelli Litsch', '1\0', 10, 1.8, '2012-04-18 11:27:42'),
    (110, '1131334773620', 48, 3, 11, 'Charlie Coe', '1\0', 10, 1.9, '2012-04-18 11:27:46');
    

2 个答案:

答案 0 :(得分:1)

如何使用像

这样的MySQL查询
SELECT * FROM quiz LEFT JOIN scores ON quiz.uid = scores.quiz_uid

然后通过它循环?

答案 1 :(得分:0)

我能够通过使用GROUP来提出解决方案。对于任何可能感兴趣的人,这就是我所做的:

// Query retrieves each unique play of each quiz the player has scored
$ss = sqlQuery("SELECT quiz.name, quiz.difficulty, scores.unique_uid, scores.quiz_uid, scores.date_created, SUM(scores.time) AS times, SUM(scores.points) AS points, SUM(scores.correct) AS ttlcorrect FROM scores, quiz WHERE scores.user_uid = {$_SESSION['uid']} AND quiz.uid = scores.quiz_uid GROUP BY scores.unique_uid ORDER BY quiz_uid, scores.date_created DESC");

$last_quiz = 0;
if ( mysql_num_rows( $ss ) > 0 ) {
    while ( $row = mysql_fetch_assoc( $ss ) ){  
        /* Step through each play of each quiz */

        if ( $row['quiz_uid'] != $last_quiz ) {
            // Output Details
            $last_quiz = $row['quiz_uid'];
?>
<h2><?php echo ( $row['name'] ); ?> <span><small>Difficulty: <?php echo( $row['difficulty'] ); ?></small></span></h2>
<?php
        }
        // Output Scores
?>
<div class="row">
<span class="score"><?php echo( number_format( $row['points'], 0) ); ?> points</span>
<span class="time"><?php echo( number_format( $row['times'], 0) ); ?> seconds</span>
<span class="correct"><?php echo( number_format( $row['ttlcorrect'], 0) ); ?> / 10 correct</span>
<span class="date">Played <?php echo( date( 'F j, Y', strtotime($row['date_created']) ) ); ?></span>
</div>
<?php
    } // $ss while()
} // close if
?>