簡體   English   中英

如何創建mysqli動態WHERE子句

[英]How to create a mysqli dynamic WHERE clause

我這里有一個應用程序: 應用程序

該應用程序在那里向您展示了兩個我想用作過濾器的下拉菜單,以便能夠從相應的下拉菜單中確定所選學生和所選問題的學生答案。

看到下拉菜單,在應用程序中選擇一個AssessmentAssessment下拉菜單並提交,你會看到學生和問題下拉下方顯示的菜單。

現在,我想做的是根據用戶單擊“ Get Student Answers按鈕時從學生和問題下拉菜單中選擇的選項來創建動態WHERE子句。

以下是當前查詢。 查詢必須具有默認子句SessionId = ? 始終在WHERE子句中。 其他子句studentId = ? questionId = ? 取決於用戶從兩個下拉菜單中選擇的選項。

$selectedstudentanswerqry = "
SELECT
StudentAlias, q.SessionId, QuestionNo, QuestionContent, o.OptionType, GROUP_CONCAT( DISTINCT Answer
ORDER BY Answer SEPARATOR ',' ) AS Answer, r.ReplyType, 
GROUP_CONCAT(DISTINCT StudentAnswer ORDER BY StudentAnswer SEPARATOR ',') AS StudentAnswer, ResponseTime
FROM Student s
INNER JOIN Student_Answer sa ON (s.StudentId = sa.StudentId)
INNER JOIN Student_Response sr ON (sa.StudentId = sr.StudentId)
INNER JOIN Question q ON (sa.QuestionId = q.QuestionId)
INNER JOIN Answer an ON q.QuestionId = an.QuestionId
LEFT JOIN Reply r ON q.ReplyId = r.ReplyId
LEFT JOIN Option_Table o ON q.OptionId = o.OptionId
WHERE (SessionId = ?)
GROUP BY sa.StudentId, q.QuestionId
ORDER BY StudentAlias, q.SessionId, QuestionNo
";

global $mysqli;
$selectedstudentanswerstmt=$mysqli->prepare($selectedstudentanswerqry);
// You only need to call bind_param once
$selectedstudentanswerstmt->bind_param("i",$_POST["session"]);
// get result and assign variables (prefix with db)
$selectedstudentanswerstmt->execute(); 
$selectedstudentanswerstmt->bind_result($detailsStudentAlias,$detailsSessionId,$detailsQuestionNo, 
$detailsQuestonContent,$detailsOptionType,$detailsAnswer,$detailsReplyType,$detailsStudentAnswer,$detailsResponseTime);
$selectedstudentanswerstmt->store_result();
$selectedstudentanswernum = $selectedstudentanswerstmt->num_rows(); 

以下是學生和問題下拉菜單,作為示例html:

學生下拉菜單:

<select name="student" id="studentsDrop">
<option value="All">All</option>
<option value="3">u0499220 - Jack Briggs</option>
<option value="7">u0093220 - Mary Kay</option>
</form>

問題下拉菜單:

<select name="question" id="questionsDrop">
<option value="All">All</option>
<option value="34">1</option>
<option value="35">2</option>
<option value="36">3</option>
</form>

我在想什么,如果選擇了一個特定的學生然后包括StudentId = ? 在WHERE子句中,如果選擇了特定的問題編號,則包括QuestionId = ? 在WHERE子句中。 但是,如果在“學生”下拉菜單中選擇了“ All值,則刪除StudentId = ? 從WHERE子句中查找,因為我們正在尋找所有學生,而不是為特定學生而苦惱。 如果從“問題”下拉菜單中選擇“ All值”,但顯然處理QuestionId = ?則這是相同的QuestionId = ?

您知道您可以在此處編寫子查詢嗎?

WHERE (SessionId = ?)

喜歡

WHERE SessionId IN(SELECT SessionId FROM ...)

http://dev.mysql.com/tech-resources/articles/subqueries_part_1.html

好吧,你知道嗎? 我想我在這里誤解了真正的問題。 您可能會發現它可以更好地工作:

    $selectedstudentanswerqry = "
    SELECT
    StudentAlias, q.SessionId, QuestionNo, QuestionContent, o.OptionType, GROUP_CONCAT( DISTINCT Answer
    ORDER BY Answer SEPARATOR ',' ) AS Answer, r.ReplyType, 
    GROUP_CONCAT(DISTINCT StudentAnswer ORDER BY StudentAnswer SEPARATOR ',') AS StudentAnswer, ResponseTime
    FROM Student s
    INNER JOIN Student_Answer sa ON (s.StudentId = sa.StudentId)
    INNER JOIN Student_Response sr ON (sa.StudentId = sr.StudentId)
    INNER JOIN Question q ON (sa.QuestionId = q.QuestionId)
    INNER JOIN Answer an ON q.QuestionId = an.QuestionId
    LEFT JOIN Reply r ON q.ReplyId = r.ReplyId
    LEFT JOIN Option_Table o ON q.OptionId = o.OptionId";

    if (studentId = something && questionId = something) {

    $selectedstudentanswerqry .= "WHERE (SessionId = ?)
    GROUP BY sa.StudentId, q.QuestionId
    ORDER BY StudentAlias, q.SessionId, QuestionNo
    ";

    } else if (studentId = somethingelse && questionId = somethingelse) {

    $selectedstudentanswerqry .= "WHERE (SessionId = ?)
    GROUP BY sa.StudentId, q.QuestionId
    ORDER BY StudentAlias, q.SessionId, QuestionNo
    ";

    } else {
    $selectedstudentanswerqry .= "WHERE (SessionId = ?)
    GROUP BY sa.StudentId, q.QuestionId
    ORDER BY StudentAlias, q.SessionId, QuestionNo
    ";
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM