繁体   English   中英

游戏MySQL表:如何仅计算每个用户的首次尝试并提供正确/不正确的总和?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM