PDA

View Full Version : تکرار یک سطر از جدول به تعداد n بار



amirsajjadi
جمعه 05 اسفند 1390, 11:22 صبح
با سلام خدمت دوستان عزیز
من میخوام از توی بانکم که دارای n سطر هست یک سطر رو به صورت رندوم انتخاب کنم. حالا بعضی از همین سطرها دارای امتیازاتی هستند که باید توی احتمال انتخاب شدنش تاثیر بزارن.
مثلا توی قرعه کشی های معمولی دید که اگه 10 نفر توی قرعه کشی شرکت کرده باشند به تعداد 10 توپ توی چرخ قرعه کشی انداخته میشه. حالا اگه یک نفر از اونا 3 امتیاز داشته باشه 3 توپ براش توی چرخ قرعه کشی می اندازند. بنابراین اون یک نفر احتمال برنده شدنش 3/10 هست.
حالا من میخوام از طریق دستورات اس کیو ال بعضی از سطر ها رو چندبار تکرار کنم که احتمال انتخابش بالا بره.
نمی خوام از کرسرها استفاده کنم چون اگه تعداد سطرهای برنامه زیاد بشه خیلی فشار روی سیستم سرور میاد.

tiphooo
جمعه 05 اسفند 1390, 15:52 عصر
شما برای برنامه قرعه کشی باید دو جدول داشته باشید یکی برای اختصاص هر ID به هر نفر و تعداد امتیازها در یک فیلد دیگر و در جدول دوم به ازاء هر امتیاز برای آن شخص یک رکورد اضافه شود در اینصورت شخص به تعداد امتیازش رکورد دارد و سپس شما از آن جدول یکی را به صورت random انتخاب کنید به عنوان برنده
فرض کنید Id یک شخص 100 است و 3 امتیاز دارد در جدول اول و دوم به صورت زیر خواهد بود
جدول اول
3 100
جدول دوم
100 RandomId1
100 RandomId2
100 RandomId3
برای پرکردن جدول دوم اگر اطلاعات شما بالای 1000000 است بگوئید تا راهنمایی کنم که در کمتر از 1 دقیقه جدول دوم ایجاد شود چون با دستورات معمولی SQL معمولا زمان بر است

amirsajjadi
جمعه 05 اسفند 1390, 20:40 عصر
شما برای برنامه قرعه کشی باید دو جدول داشته باشید یکی برای اختصاص هر ID به هر نفر و تعداد امتیازها در یک فیلد دیگر و در جدول دوم به ازاء هر امتیاز برای آن شخص یک رکورد اضافه شود در اینصورت شخص به تعداد امتیازش رکورد دارد و سپس شما از آن جدول یکی را به صورت random انتخاب کنید به عنوان برنده
فرض کنید Id یک شخص 100 است و 3 امتیاز دارد در جدول اول و دوم به صورت زیر خواهد بود
جدول اول
3 100
جدول دوم
100 RandomId1
100 RandomId2
100 RandomId3
برای پرکردن جدول دوم اگر اطلاعات شما بالای 1000000 است بگوئید تا راهنمایی کنم که در کمتر از 1 دقیقه جدول دوم ایجاد شود چون با دستورات معمولی SQL معمولا زمان بر است
سلام
ممنون از پاسختون
این روشی که شما میگید معقوله؟
نمیشه رندوم رو طوری پیاده سازی کنیم که احتمال بعضی از رکوردها بره بالا؟

یوسف زالی
جمعه 05 اسفند 1390, 22:13 عصر
سلام.
روش دیگر هم چنین است:
شما به ازای هر ردیف دو ستون اضافه کنید.
یکی از و دیگری تا.
بعد بر اساس شانس هر ردیف اعدادی رو در اون پر کنید.
مثلا:
ردیف اول از 1 تا 1
ردیف دوم از 2 تا 5
ردیف سوم از 6 تا 12
.
.

بقیش هم واضح هست..

select *
from TBL
where FLOOR( RAND() * LastTa ) +1 between Az and Ta

amirsajjadi
جمعه 05 اسفند 1390, 22:43 عصر
میشه بگید این برنامه چیکار انجام میده !!!؟؟؟

یوسف زالی
شنبه 06 اسفند 1390, 00:53 صبح
دوست عزیز اون قطعه کد سودو برای مثال شماست.
کدوم قسمتش رو متوجه نشدید؟
روند کار رو یا کد رو؟

amirsajjadi
شنبه 06 اسفند 1390, 06:30 صبح
سلام.
روش دیگر هم چنین است:
شما به ازای هر ردیف دو ستون اضافه کنید.
یکی از و دیگری تا.
بعد بر اساس شانس هر ردیف اعدادی رو در اون پر کنید.
مثلا:
ردیف اول از 1 تا 1
ردیف دوم از 2 تا 5
ردیف سوم از 6 تا 12
.
.

بقیش هم واضح هست..

select*
from TBL
whereFLOOR(RAND()* LastTa )+1 between Az and Ta

سلام
کل برنامه رو متوجه شدم ولی این تکه برنامه ی شما یک مشکل کوچیک (البته مشکل نیست بلکه یک کار اضافی هست) که داره اینه که مثلا اگر یکی از رکوردها امتیازش زیاد بشه و عددی که در فیلد "تا" قرار داره زیاد بشه باید تمام اعداد فیلدهای "از" و "تا" از اون رکورد به بعد زیاد بشن.
مثلا
امتیاز رکورد یک از=1 تا=1
امتیاز رکورد دو از=2 تا=5
امتیاز رکورد سه از=5 تا=7

حالا اگه رکورد دو بشه از=2 تا=9
امتیاز رکورد سه از=9 تا 11

و اگه n تا رکورد باشه، n-m تا رکورد پایین رکورد m باید بروز بشن که این بروز رسانی مستلزم قفل کردن رکوردها و یکسری مشکلات دیگه هست.

baktash.n81@gmail.com
شنبه 06 اسفند 1390, 07:55 صبح
سلام

به نظر من روش دوتا جدول که دوستان گفتن بهترین و معقول ترین روشه ... بانک ها هم از روش مشابهی استفاده می کنند یعنی به تعداد امتیاز های شما عدد 16 رقمی می سازند و به اسم شما نگهداری می کنند بعد یه عدد 16 رقمی رندم می سازند و بعد این عدد رو تو جدول جستجو می کنن ببینن ماله کیه ... (البته از 16 رقمی بودنش مطمئن نیستم) در نتیجه شما هرچی تعداد اعداد 16 رقمیتون بیشتر باشه شانستون بیشتره ...