我有两张与琐事测验游戏的这一部分有关的表:scores
和quiz
。我已经嵌套了许多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个问题)。
我现在的做法是:
quiz.uid
scores.unique_uid
quiz.uid
scores.unique_uid
的每组记录的SUM()数据(我无法与DISTINCT查询成功结合)这是我的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');
答案 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
?>