ايران ويج

نسخه‌ی کامل: انتخاب تصادفی رکورد از بین چند جدول
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
سلام ، دستور اس کیو ال رو با توجه به شرایط ذیل به چه شکل باید نوشت ؟

[تصویر:  66g3ev.jpg]
دستوري توي SQL براي انتخاب Random وجود نداره
كاري كه شما بايد انجام بدي اينه:
1. عددي بين "0" و "تعداد Row هاي جدول" به صورت Random انتخاب مي كني
2. اين دستور SQL رو مي نويسي: "SELECT * FROM tablename WHERE id = random"
فقط بايد جدولت يه ستون به نام id داشته باشه
حالا اگه مي خواي از جدولت 5 تا ركورد رو به صورت Random انتخاب كني، بايد مراحل بالا رو 5 بار انجام بدي
طراحی دیتابیستون اشتباهه.
اول میاید سه تا جدولتونو یکی میکنید. یه فیلدم اضافه میکنید که نوع سوالو بگه. یعنی میشه 4 تا فیلد. code-quiz-kelid-type .
حالا میتونید توی برنامه به تعدادی که میخواید کد تولید کنید. بعد با کلمه IN و دستورات sql اونا رو در بیارید.
ویرایش: شرمنده جواب جناب far_222000 رو ندیده بودم. فیلد id شون همون codeهست فکر کنم. با دستور IN دیگه نیاز به تکرارم نیست.
در تکمیل گفته دوستان :

شما جدول سوالات رو یکی کنین
من برنامه رو برفرض این دیتابیس توضیح میدم :
کد:
ID              Cname                    Quest
A1                Access                    Q1
A2                Access                    Q2
A3                Access                    Q3
W1               Word                      Q1
W2               Word                      Q2
W3               Word                     Q3
...
...
الان میخواهیم 2 سوال تصادفی از اکسس استخراج کنیم پس داریم :
کد:
Dim Acm As String
Dim Comma As String
Dim x As Integer
For i = 1 To 2
    Randomize Timer
    x = Int(Rnd() * 3) + 1
    Do While (InStr(Acm, CStr(x)) <> 0)
        Randomize Timer
        x = Int(Rnd() * 3) + 1
    Loop
    Acm = Acm & Comma & "A" & Trim(Str(x))
    Comma = ","
Next
الان یک رشته از کلیدهای تصادفی مربوط به سوالات درس اکسس تهیه شده که هیچکدومشون تکراری نیست
میرسیم به تهیه این کوئری :
کد:
Dim Qlist As Variant
Dim strSQL, strSQL2, strOR As String
strSQL = "SELECT Quest FROM Table1 WHERE (Cname='Access' AND "
Qlist = Split(Acm, ",")
For i = 0 To UBound(Qlist)
    strSQL2 = strSQL2 & strOR & "ID='" & Qlist(i) & "'"
    strOR = " OR "
Next
strSQL = strSQL & strSQL2 & ");"
با ادامه این کار و تعویض کلمه اکسس با ورد و حرف A با حرف W میتوان سوالات ورود رو استخراج کرد .
سلام.
من فقط فرمول عدد تصادفي رو مي گم که مي شه با کدهايي که دوستان گذاشتن ترکيب کرد.
کد:
randomize (second(now) * minute(now))
x=(حدپايين-حد بالا )*rnd + حد پايين
حدبالا: حداکثر مقدار
حدپايين: حداقل مقدار
اميدوارم بدردتون بخوره.

موفق باشيد.
یک چیز دیگه یادم افتاد وقتی کلید هر سوال رو با اولین حرف همون سوال شروع میکنیم دیگه نیازی به ستون اضافی نام درس نداریم

و اگه کدها رو خلاصه کنیم اینو داریم :
کد:
ID                     Quest
A1                         Q1
A2                         Q2
A3                         Q3
W1                        Q1
W2                        Q2
W3                        Q3
...
...
الان برای انتخاب 2 سوال ورد و 2 سوال اکسس داریم :
کد:
public function RndQuest(QCount as integer,NCount as integer,Lesson as string)as string

Dim Acm As String
Dim Comma As String
Dim x As Integer
For i = 1 To NCount
    Randomize Timer
    x = Int(Rnd() * QCount) + 1
    Do While (InStr(Acm, CStr(x)) <> 0)
        Randomize Timer
        x = Int(Rnd() *  QCount) + 1
    Loop
    Acm = Acm & Comma & Lesson & Trim(Str(x))
    Comma = ","
Next
RndQuest=Acm
end function
با تابع بالا میتوان با دادن تعداد کل سوالات ، تعداد سوالاتی که باید استخراج شوند و حرف اختصاری هر درس یک رشته از کلیدهای غیر تکراری اون درسو بدست بیاریم .
کد:
public function GetSQL(strID as string)as string
Dim Qlist As Variant
Dim strSQL, strSQL2, strOR As String
strSQL = "SELECT Quest FROM Table1 WHERE ( "
Qlist = Split(strID, ",")
For i = 0 To UBound(Qlist)
    strSQL2 = strSQL2 & strOR & "ID='" & Qlist(i) & "'"
    strOR = " OR "
Next
strSQL = strSQL & strSQL2 & ");"
GetSQL= strSQL
end function
حالا میتوان با یک فراخوانی ساده کد اسکیو ال انتخاب سوالات رو بدست اورد :
کد:
SQL = GetSQL(RndQuest(3, 2, "A") & "," & RndQuest(3, 2, "W"))
قابل اجراست ولي از نظر طراحي اشتباه است.
کجاش اشتباست ؟