[英]Game mysql table: How to count only first attempt per user and provide total SUM of correct/incorrect?
我创建了一个游戏,用户可以根据需要多次回答测验问题。 请在此处查看示例问题 (统计信息位于侧边栏右上方)。
目前,我仅统计总数,即所有用户的所有尝试次数。 当然,这是在按问题统计。
SELECT SUM(correct=1) AS correct, SUM(correct=0) AS incorrect, timestamp
FROM `gametable`
WHERE questionid = #
游戏桌的日期示例:
+---------------------+--------+------------+---------+
| timestamp | userid | questionid | correct |
+---------------------+--------+------------+---------+
| 2014-12-07 15:38:35 | 1 | 33 | 0 |
| 2014-12-07 15:39:40 | 1 | 33 | 1 |
| 2014-12-07 15:41:40 | 1 | 33 | 1 |
| 2014-12-07 16:00:17 | 2 | 33 | 1 |
| 2014-12-07 16:08:00 | 2 | 33 | 0 |
| 2014-12-07 16:09:00 | 2 | 33 | 0 |
| 2014-12-07 16:10:25 | 2 | 33 | 1 |
+---------------------+--------+------------+---------+
给出了mysql查询的上表的结果将是:4个正确和3个不正确。
但是, “首次尝试”结果应为: 1个正确和1个不正确 。
有没有办法编写一个mysql查询来做到这一点?
使用子查询获取每个用户的首次尝试:-
SELECT SUM(correct=1) AS correct, SUM(correct=0) AS incorrect
FROM `gametable`
INNER JOIN
(
SELECT userid, MIN(timestamp) AS mintimestamp
FROM `gametable`
GROUP BY userid
) sub0
ON gametable.userid = sub0.userid
WHERE questionid = #
AND gametable.timestamp = sub0.mintimestamp
注意,我从您的外部选择中删除了timestamp列,因为它似乎不是必需的,也不会带回有意义的值。
请注意,示例数据不包含问题字段,但示例SQL包含。 假设您确实有一个问题字段,那么您还需要选择特定问题的首次尝试:-
SELECT SUM(correct=1) AS correct, SUM(correct=0) AS incorrect
FROM `gametable`
INNER JOIN
(
SELECT userid, questionid, MIN(timestamp) AS mintimestamp
FROM `gametable`
GROUP BY userid, questionid
) sub0
ON gametable.userid = sub0.userid
AND gametable.questionid = sub0.questionid
AND gametable.timestamp = sub0.mintimestamp
WHERE gametable.questionid = #
要么
SELECT SUM(correct=1) AS correct, SUM(correct=0) AS incorrect
FROM `gametable`
INNER JOIN
(
SELECT userid, MIN(timestamp) AS mintimestamp
FROM `gametable`
WHERE gametable.questionid = #
GROUP BY userid
) sub0
ON gametable.userid = sub0.userid
AND gametable.timestamp = sub0.mintimestamp
编辑-建议根据Cookie ID处理匿名用户。 如果用户ID为null,则返回cookie id,否则返回cookie id为null。 这样做是为了对具有用户ID的记录忽略cookie ID。
SELECT SUM(correct=1) AS correct, SUM(correct=0) AS incorrect
FROM `gametable`
INNER JOIN
(
SELECT userid, if(userid IS NULL, cookie_id, NULL) AS cookie_id, questionid, MIN(timestamp) AS mintimestamp
FROM `gametable`
GROUP BY userid, cookie_id, questionid
) sub0
ON ((gametable.userid IS NULL
AND gametable.cookie_id = sub0.cookie_id)
OR (gametable.userid IS NOT NULL
AND gametable.userid = sub0.userid))
AND gametable.questionid = sub0.questionid
AND gametable.timestamp = sub0.mintimestamp
WHERE gametable.questionid = #
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.