1

ユーザー、質問、アクションの3つのテーブルがあります。これらは、チュートリアルサイトで質問に回答するユーザーに関連するデータを保持します。十分な質問に答えたら、新しいセクションの質問に進みます。彼らは、すべてを完了するまで、未回答の質問のプールからランダムな順序で質問を継続的に要求します。

ユーザーがセクションに対して十分な質問を取得できず、その特定のセクションのデータベース内の質問の総数が不足した場合、コードをループバックして、すべてのセクションの質問をランダムな順序で再度提供する必要があります。

その時点まで、私はこのクエリを使用していましたが、

    SELECT action_int
    FROM actions
    WHERE user_id = '".$this->id."'
    AND action_type = 'given_question'
    AND action_details = 'weekly'
    AND action_int IN (
        SELECT action_int
        FROM actions
        WHERE user_id = '".$this->id."'
        AND action_type = 'answered_question'
        )
    AND action_int IN (
        SELECT id
        FROM questions
        WHERE section_id = '".$this->current_section."'
        )

action_intは、アクションテーブルに格納されている質問IDです。これにより、ユーザーの現在のセクションで回答されたすべての質問が返されますが、コードがループバックした場合は繰り返されません。

したがって、これを解決するための最初のアプローチは、ユーザーが回答したすべての質問を取得し、その固有の質問に回答した回数をカウントするようにデータベースにクエリを実行することでした(以前にすべての質問をループした場合) 、およびカウントが最小である値(MIN())から質問IDをランダムに選択します。

努力しています、

SELECT q.id, a.count
FROM questions q

LEFT JOIN (
SELECT
    action_int AS id, count(action_int) AS 'count'
FROM
    actions
WHERE
    action_type = 'answered_question'
GROUP BY action_int) a
ON  a.id = q.id

戻る、

id  count

14  2
16  3
17  3
11  null
13  null
15  null
18  1
12  1
19  null

これは一般的に私が求めているものです。

だから質問、

  1. これを行うためのより良い方法はありますか?質問がまだ回答されていない場合、カウントにnullではなく0が返されるようにするためかもしれません。
  2. ユーザーの現在のセクションにある回答済みの質問(section_idとして質問に格納され、current_sectionとしてユーザーに格納されている)のみをカウントしたい場合、セクション番号から質問の[id、count]のみを含む列を返すにはどうすればよいですか?
4

0 に答える 0