2

ここでは、できるだけ手短に、本題に沿って説明しようと思います。これらは私のテーブルです:

アンケート:

  • id[pk]、
  • 名前、
  • タイプ

user_x_アンケート:

  • id[pk]、
  • ユーザーID[fk]、
  • 調査票ID[fkは調査票.idを参照]
  • 完成状態、
  • 反復

アンケート時間

  • id[pk]
  • 調査票ID[fkは調査票.idを参照]
  • 反復
  • 公開日[日時]
  • 締め切り[日時]

そのため、ユーザーはいくつかのアンケートに記入したいと考えています。各ユーザーは、入力する 1 つ以上のアンケートに割り当てることができます (user_x_questionnaire)。アンケートの種類 (1 回または頻繁) に応じて、ユーザーは各アンケートに複数回入力できます。

私が欲しいのは、ユーザーが回答することになっている現在のすべてのアンケートを表示するクエリです。つまり、アンケートの時間は公開日と締め切りの間にある必要があります。返されたすべての結果が同じ発行と締め切りを生成することに気付くまで、このクエリの答えに非常に近づきましたが、これは私が望んでいたものではありませんでした。これがこれまでの私の解決策です。

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 に答える