簡體   English   中英

在數據庫中選擇多個不同的值

[英]Selecting multiple distinct values in database

我有此在線測驗會生成隨機問題,但唯一的問題是它會重復前面的問題。 我的問題有限(我的表中有10個問題,但是我將問題的數量限制為5個。輸出將僅顯示5個隨機問題),我將其命名為RequiredRecords。

 question_id 
     1 
     3
     4
     7 
     9 
     14 
     15
     24
     26
     29

隨機輸出后應該輸出

  question_id 
     3
     4
     9 
     14 
     24

我嘗試訪問此問題 ,但不能解決我的問題。 以下是我使用的一些代碼和SQL語句。

我發現創建隨機問題的查詢沒有任何問題,可以不進行重復顯示,但是我的其他代碼存在問題,使程序具有重復性。 請幫我。


使用VS2008 3.5的代碼隱藏

Partial Class Student_DetailView
Inherits System.Web.UI.Page

Shared TotalRecords As Integer
Private sqlda As SqlDataAdapter
Private dt As DataTable

Private Function CreateConnection() As SqlConnection
    Dim _connectionString As String = ConfigurationManager.ConnectionStrings("LMSConnectionString").ConnectionString
    Return New SqlConnection(_connectionString)
End Function

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    Dim quiz_id As Integer
    quiz_id = Session("quiz_id")

    Dim query As String = "SELECT COUNT(*) AS TotalRecords FROM tblQuizQuestion WHERE (quiz_id = '" & quiz_id & "')"
    Dim dt As DataTable = GetRecords(query)
    TotalRecords = Convert.ToInt32(dt.Rows(0)("TotalRecords"))

    getQuestions()
End Sub

Public Function GetRecords(ByVal Query As String) As DataTable
    Dim connection As SqlConnection = CreateConnection()
    connection.Open()
    sqlda = New SqlDataAdapter(Query, connection)
    dt = New DataTable()
    sqlda.Fill(dt)
    connection.Close()
    Return dt
End Function

Public Function RandomNumbers(ByVal max As Integer) As ArrayList
    Dim lstNumbers As New ArrayList()
    Dim rndNumber As New Random()
    Dim number As Integer = rndNumber.[Next](1, max + 1)
    lstNumbers.Add(number)
    Dim count As Integer = 0
    Do
        number = rndNumber.[Next](1, max + 1)
        If Not lstNumbers.Contains(number) Then
            lstNumbers.Add(number)
        End If
        count += 1
    Loop While count <= 10 * max
    Return lstNumbers
End Function

Public Function GetRandomNumbersCSV(ByVal max As Integer, ByVal req As Integer) As String
    Dim CSV As String = ""
    Dim lstNumbers As ArrayList = RandomNumbers(max)
    For i As Integer = 0 To req - 1
        CSV += lstNumbers(i).ToString() & ","
    Next
    CSV = CSV.Remove(CSV.Length - 1)
    Return CSV
End Function

Protected Sub buttonNext_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles buttonNext.Click
    If Not Session("dt") Is Nothing Then
        getQuestions()
        Try
            ' Save off previous answers
            Dim dr As System.Data.DataRowView
            dr = CType(questionDetails.DataItem, System.Data.DataRowView)

            ' Create Answer object to save values
            Dim a As Answer = New Answer()
            a.CorrectAnswer = dr("answer").ToString()
            a.UserAnswer = answerDropDownList.SelectedValue.ToString()

            Dim al As ArrayList
            al = CType(Session("AnswerList"), ArrayList)
            al.Add(a)

            Session.Add("AnswerList", al)

        Catch ex As Exception

            Response.Redirect("default.aspx")
        End Try
        If questionDetails.PageIndex = questionDetails.PageCount - 1 Then
            ' Go to evaluate answers
            Response.Redirect("results.aspx")
        Else
            questionDetails.PageIndex += 1

        End If

        If questionDetails.PageIndex = questionDetails.PageCount - 1 Then
            buttonNext.Text = "Finished"
        End If
    End If
End Sub

Private Sub getQuestions()
    Dim RequiredRecords As Integer
    RequiredRecords = 5
    Dim CSVData As String, query As String
    Dim quiz_id As Integer
    quiz_id = Session("quiz_id")
    If TotalRecords >= RequiredRecords Then
        CSVData = GetRandomNumbersCSV(TotalRecords, RequiredRecords)

        query = "SELECT distinct question_id,quiz_question, choice1, choice2, choice3, choice4, answer, quiz_id FROM " & _
                "(SELECT question_id,quiz_question, choice1, choice2, choice3, choice4, answer, quiz_id , ROW_NUMBER() OVER(ORDER BY rand()) " & _
                "AS RowID FROM tblQuizQuestion WHERE quiz_id = '" & quiz_id & "') TempTable WHERE RowID IN(" & CSVData & ")"
        dt = GetRecords(query)
        Session("dt") = dt
        questionDetails.DataSource = dt
        questionDetails.DataBind()
    Else
        Response.Write("Required Records must be greater than Requried Records.")
    End If
End Sub

End Class

您應該可以像這樣隨機分配問題

從“按隨機字符串排序的問題”中選擇前5個QuestionID,newID()作為RandomString

newid()是一個關鍵字,它將為您提供隨機的引導,然后按以下順序對問題進行排序

看看這個答案,以一種可預測的方式對來自數據庫的條目進行隨機化的方法,該方法可以讓您從中斷的地方繼續工作。Linq Orderby隨機ThreadSafe用於ASP.NET

您可以通過特定值(例如,用戶ID,用戶ID加日期,...)為隨機數生成器添加種子,然后輕松地從數據庫中獲取每個項目,而無需從隨機序列中了解所需項目的索引。

暫無
暫無

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

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