2

我将在这里尽可能简短和切入正题。这些是我的表:

问卷:

  • 身份证[PK],
  • 姓名,
  • 类型

user_x_questionnaire:

  • 身份证[PK],
  • 用户名 [fk],
  • 问卷ID[fk 参考问卷.id]
  • 完成状态,
  • 迭代

问卷调查时间

  • 编号[pk]
  • 问卷ID[fk 参考问卷.id]
  • 迭代
  • 发布日期[日期/时间]
  • 截止日期[日期/时间]

所以,用户想要填写一些问卷。可以为每个用户分配一份或多份问卷以填写 (user_x_questionnaire)。根据问卷类型(一次或频繁),用户可以多次填写每个问卷,因此问卷调查表存储每个时间的发布日期和截止日期。

我想要的是一个显示用户应该回答的所有当前问卷的查询。这意味着问卷的时间应该在发布日期和截止日期之间。我非常接近这个查询的答案,直到我意识到我返回的所有结果都产生了相同的发布和截止日期,这不是我想要的。到目前为止,这是我的解决方案。

SELECT * FROM (
   SELECT DISTINCT questionnaire.id
        , questionnaire.`name`
        , user_x_questionnaire.iteration
        , completedstate
        , questionnaire_time.publishdate
        , questionnaire_time.deadline
   FROM user_x_questionnaire
      , questionnaire_time
      , questionnaire 
   WHERE  userid={USERID} 
      AND user_x_questionnaire.questionnaireid=questionnaire.id
      AND questionnaire.`type`='frequent' 
      AND user_x_questionnaire.questionnaireid=questionnaire_time.questionnaireid
   ) As result
WHERE '{CURRENT DATE}' BETWEEN publishdate AND deadline; 

{USERID} 和 {CURRENT DATE} 将由程序提供。

4

2 回答 2

1

这应该会显示所有活动的问卷,即使 {USER} 没有回复:

SELECT q.id, q.`name`, u.iteration, u.completedstate, t.publishdate, t.deadline
FROM questionnaire q
  INNER JOIN questionnaire_time t 
          ON t.questionnaireid = q.id
    LEFT JOIN user_x_questionnaire u 
           ON u.questionnaireid = t.questionnaireid
          AND u.userid={USERID} 
WHERE q.`type`='frequent' 
  AND '{CURRENT DATE}' BETWEEN t.publishdate AND t.deadline;
于 2012-11-07T22:39:55.227 回答
0

最后!

select distinct q.id,
q.`name`,
uq.iteration,
completedstate,
qt.publishdate,
qt.deadline
from questionnaire_time qt,questionnaire q, user_x_questionnaire uq 
where qt.questionnaireid = q.id 
and qt.questionnaireid = uq.questionnaireid 
and uq.userid="{USERID}" 
and '{CURRENT DATE}' between qt.publishdate and qt.deadline 
group by q.id
于 2012-11-08T21:40:19.227 回答