PDA

View Full Version : بدست آوردن نتایج جستجو به صورت تصادفی



rahami
سه شنبه 12 مهر 1384, 07:28 صبح
سلام به همه دوستان و عرض تبریک به مناسبت فرارسیدن ماه میهمانی خدا، ماه مبارک رمضان
اگر بخواهیم که در هر بار Select از یک جدول رکورد های نتایج ، ترتیب تصادفی داشته باشند چه کاری باید انجام دهیم؟ و اصولا آیا انجام چنین کاری امکان پذیر است یا خیر؟
من در برنامه خودم ار DataSet برای کار با گرید و در چند مورد از DataReader استفاده کرده ام.
متشکرم

Behrouz_Rad
سه شنبه 12 مهر 1384, 15:25 عصر
راهی که به ذهن بنده میرسه این است که از دو DataSet استفاده کنید.
پس از انتقال رکوردهای حاصل از نتیجه ی جستجو به اولین DataSet، تعداد رکوردهای یافت شده را با دستور:


Dim NumRecs As Int32 = myDataSet.Tables(0).Rows.Count

به دست آورید.
حال با یک حلقه ی شمارنده ی نزولی، تک تک رکوردهای DataSet اول را به DataSet دوم کپی کنید.
پس از کپی هر رکورد به DataSet دوم، رکورد کپی شده از DataSet اول را با استفاده از اندیس آن (که اندیس، همان عدد تولید شده به صورت تصادفی است که در ادامه توضیح داده می شود) حذف کنید.
برای اینکه اینکار به صورت راندوم انجام پذیرد، هر بار با استفاده از متد Next کلاس Random، یک عدد بین صفر تا تعداد رکوردهایی که در DataSet اول وجود دارد (و این تعداد در کپی هر رکورد از DataSet اول به دوم، یک واحد کاهش پیدا می کند) ایجاد کنید.
حال، DataSet دوم حاوی رکوردهایی است که به صورت تصادفی در آن قرار گرفته اند.
موفق باشید.

rahami
چهارشنبه 13 مهر 1384, 09:34 صبح
روش جالب و خلاقانه ای است.
اما فکر نمی کنید سرعت پایین بیاید؟مخصوصا موقعی که یوزر ها زیاد شوند.
امتحانش می کنم.
آیا از طریق Stored Procedure ها هم می شود کاری کرد؟
متشکرم

Behrouz_Rad
چهارشنبه 13 مهر 1384, 12:37 عصر
بله ممکنه در کارایی برنامه ی شما تاثیر بگذاره.
مشکلی که در اینجا وجود داره اینه که به هر رکورد تنها باید یک بار مراجعه بشه!
فکر می کنم تنها راهی که وجود داره همان راه است.
اگر دوستان راه دیگه ای به ذهنشون میرسه، دیدن اون روش باعث بسی خوشحالی است!

iekrang
چهارشنبه 13 مهر 1384, 14:14 عصر
راهی که من به ذهنم میرسه اینه:
که رکوردها رو داخل یک حلقه for بخونید.
و برای تصادفی بودن رکوردها step حلقه for رو یه عدد random انتخاب کنید.
یعنی هر دفعه با توجه به تعداد رکوردهاتون یه عدد تصادفی (فرضاً x )ایجاد کنید و با استفاده از اون عدد رکوردهاتون رو به صورت x در میان بخونید.
امیدوارم که متوجه منظورم شده باشید.

Behrouz_Rad
چهارشنبه 13 مهر 1384, 15:11 عصر
پیاده سازی روشی که فرمودید، نه عاقلانه است و نه کارآمد!
فرضا 4 رکورد داریم. اگر در 4 مرحله ی پشت سر هم، عدد 5 تولید شود:
اولا: این رکوردها بدون حالت تصادفی نمایش داده می شوند:
دوما: حتما باید یک ساختار Try Catch ایجاد کنید چون ممکنه عددی تصادفی ایجاد بشه که معادل اون در اندیس Dataset وجود نداشته باشه!!! Out of Range
در نهایت این روش، زمان بسیار زیادی رو تلف می کنه و پیاده سازی اون به هیچ وجه منطقی نیست!
موفق باشید.

Farhad.B.S
پنج شنبه 14 مهر 1384, 01:09 صبح
میتونی در انتهای عبارتSelect مورد نظرت از Clause زیر استفاده کنی :


ORDER BY NEWID()

وظیفه NEWID در T-SQ تولید یک GUID جدیده ، بنابراین با استفاده از عبارت بالا نتیجه حاصله از کئوری هربار به صورت random سورت میشه.
در همین بخش یا در بخش SqlServer قبلا راجع بهش بحث شده.

Behrouz_Rad
پنج شنبه 14 مهر 1384, 07:26 صبح
درسته فرهاد :تشویق:
البته به جای Group By باید بنویسید Order By
thanks my dear friend :لبخندساده

Farhad.B.S
پنج شنبه 14 مهر 1384, 09:58 صبح
ممنون از توجهت ، اصلاح شد.