0

「質問」をクエリし、「回答」と結合しています。各質問には、2 つ以上の回答がある場合があります。そのため、返される質問の数に回答の数が掛けられています。これにより、ページネーションを実装できなくなります。どうすればこれを回避できますか? ありがとう。

これが私のクエリです:

<cfquery name="questions">
    SELECT
       questions.id as questionid,
       questions.question as question,
       questions.rank as rank,
       questions.isrequired as isrequired,
       questiontypes.id AS questiontypeid,
       questiontypes.name as questiontype,
       questiontypes.template as template,
       questions.survey_id as survey_id,
       surveys.name as surveyname,
       surveys.questionsperpage as questionsperpage,
       surveys.thankyoumsg as thankyoumsg,
       answers.id as answerid,
       answers.answer as answer
    FROM
       questions
   LEFT JOIN answers ON answers.question_id = questions.id
   INNER JOIN questiontypes ON questions.questiontype_id = questiontypes.id
   INNER JOIN surveys ON questions.survey_id = surveys.id
   WHERE
   questions.survey_id = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.surveyid#">  
</cfquery>
4

3 に答える 3

2

これはより明確な説明ですが、コメントで述べたように、Steve と Brad が提案する代替案は、 2 つのクエリが必要であるという点で「リスト アプローチ」とは異なります。1 つは現在のページに表示する質問の ID を取得するためのものです。 、および関連する回答を取得するもの。

それを実装するにはさまざまな方法がありますが、1 つのオプションは、Steve が述べたように「グループ化された」出力を使用することです。1 ページに 10 件のレコードを表示していて、結果11をで表示したいとします20。最初にクエリを実行して、質問 ID を取得します。

    <!---  For clarity these are descriptive, rather than actual, column names --->
    <cfquery name="getCurrentPageQuestions" .....>
        SELECT  QuestionID
        FROM    Questions
        WHERE   SurveyID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.surveyid#"> 
        ORDER BY WhateverColumnsYouWant
        LIMIT  11, 20
    </cfquery>

次に、これらの ID を使用して、元の JOIN をフィルター処理します。最初のクエリがそれを処理したため、調査 ID のフィルターをスキップできます。

重要:最初にグループ化された列で結果を並べ替える必要があります。そうしないと、グループ化された cfoutput が機能しません。

    <cfquery name="getAnswers" .....>
        SELECT
                q.QuestionID
                , q.Question
                , a.AnswerID
                , a.Answer
                , .....
        FROM    questions q
                    LEFT JOIN answers a ON a.questionID = q.questionID
                    INNER JOIN questiontypes qt ON qt.questionTypeID = q.questionTypeID
                    INNER JOIN surveys s ON s.surveyID = q.surveyID
        WHERE  q.questionID IN 
               (
                   <cfqueryparam value="#valueList(getCurrentPageQuestions.questionID)#" 
                        list="true" 
                        cfsqltype="cf_sql_integer">
               )
        ORDER BY q.questionID
    </cfquery>

最後に、Steve の例を使用して、結果を適切な形式で表示します。

    <cfouput query="getAnswers" group="questionID">
         <!--- display question once --->
        #question#<br>

       <cfoutput> 
            <!--- display all answers --->
             - #answer#<br>
        </cfoutput>
    </cfoutput>
于 2013-09-06T19:59:48.373 に答える