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