0

我正在查询“问题”并与“答案”一起加入。每个问题可能有两个或多个答案。因此,返回的问题数乘以答案数。这使我无法实现分页。我怎样才能避免这种情况?谢谢。

这是我的查询:

<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

您可以使用以下命令获取逗号分隔列表中的 ID 和答案group_concat()

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,
       group_concat(answers.id) as answerids,
       group_concat(answers.answer) as answers
    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#">
   group by questions.id
于 2013-09-04T14:37:46.010 回答
2

这更像是一个澄清,但正如我在评论中提到的,史蒂夫和布拉德建议的替代方案与“列表方法”不同,因为它们需要两个查询:一个检索要在当前页面上显示的问题的 id , 和一个来获取相关的答案。

有不同的方法来实现它,但一种选择是使用史蒂夫提到的“分组”输出。假设您每页显示 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 回答
1

因为这被标记为 ColdFusion。我想提出一个 ColdFusion 优雅的解决方案,它更容易处理逗号连接的列表。

如果您使用 <cfoutput> 标记,带有属性查询和分组,您可以使用 1 个问题和 x 个答案分层输出数据。

<cfouput query="questions" group="questionID">
    #question#<br>
    <cfoutput>
    - #answer#<br>
    </cfoutput>
</cfoutput>

您可以在 div 或表格行中设置此输出的样式,并使用问题/答案类将它们适当地缩进彼此下方。

至于“阻止我实现分页”的附带问题,有太多方法可以剥去那只猫的皮。我建议研究一些ajax。对您的问题进行分页,并在用户单击“显示答案”时获取答案

于 2013-09-05T18:45:32.877 回答