0

我有 2 张桌子。

quiz table 
=================
id, q_name, code


completed_quizes table
======================================================
id, completion_date, user_id, quiz_code, quiz_count

我有 2 种测验

Table_name: quiz_names
id     q_name              code
1      grand_quiz          gra
2      normal_quiz         nor

Table_name: completed_quizes
id    completion_date         user_id      q_code   q_count
1     1340841600 (28June2012)    2          gra       0
2     1340755200(27June2012)     2          nor       3
3     1340668800(26June2012)     2          nor       2
4     1340582400(25June2012)     2          nor       1
5     1340496000(24June2012)     2          gra       0
6     1340841600 (28June2012)    3          gra       0
7     1340755200(27June2012)     3          nor       3
8     1340668800(26June2012)     3          nor       2
9     1340582400(25June2012)     3          nor       1
10    1340496000(24June2012)     3          gra       0

规则:

1-首先将进行所有用户的大测验。

2-基于大测验,如果任何用户上次测验是大测验,那么下一个建议将是普通测验 1。

3- 基于普通测验 1,如果任何用户上次测验是普通测验 1,那么下一个建议将是普通测验 2。

4- 基于普通测验 2,如果任何用户上次测验是普通测验 2,那么下一个建议将是普通测验 3。

5-如果任何用户上次测验是正常测验 3,那么大测验将是下一个建议。

附言

问题是每个用户的下一个建议都是基于他之前完成的测验。我想要下一个测验的所有用户?

请问有什么建议吗?

4

2 回答 2

2

您需要分组最大值来获取每个用户执行的最新测验,然后加 1(MOD用于将最近参加测验 3 的人旋转回 0)。要包括尚未参加任何测验的用户,您需要与您的用户表进行外部联接:

SELECT user_id, IFNULL((q_count+1) % 4, 0) AS next
FROM   users LEFT JOIN (
  completed_quizes NATURAL JOIN (
    SELECT   user_id, MAX(completion_date) AS completion_date
    FROM     completed_quizes
    GROUP BY user_id
  ) AS t
) USING (user_id)

sqlfiddle上查看。

于 2012-06-28T09:30:48.357 回答
1

试试这个 ::

select 
q_code, 
CASE 
WHEN q_code='gra'
THEN 'nor1'
ELSE IF q_code='nor3'
THEN 'gr'
ELSE
CONCAT('nor',CAST(MAX(q_count+1) as CHAR))
END as suggestion

from completed_quizes group by user_id 
于 2012-06-28T09:32:53.570 回答