簡體   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