PDA

View Full Version : قرعه کشی با در نظر گرفتن امتیاز؟



hamid1988
جمعه 04 اسفند 1391, 20:39 عصر
با سلام
دوستان من دو جدول دارم:

اعضا: اطلاعات اعضا
امتیازها: آیدی عضو (کلید خارجی) و امتیاز عضو

میخام 5 عضو رو بصورت رندم انتخاب کنم به شرطه اینکه امتیاز هم در انتخاب مخاسبه بشه یعنی عضوی که امتیاز بیشتری داره شانس بیشتری داشته باشه.
لطفاَ در نوشتن کوئریش کمکم کنید.

samani
شنبه 05 اسفند 1391, 08:42 صبح
سلام

بصورت رندم انتخاب کنم
براي انتخاب رندوم ركورد از اطلاعات شما ميتونيد از اين دستور استفاده كنيد

ORDER BY NEWID()


عضوی که امتیاز بیشتری داره شانس بیشتری داشته باشه
براي اينكار اسم شخص ميتونه به تعداد امتيازش در قرعه كشي بياد تا شانسش نسبت به امتيازش باشه

براي مثال:

DECLARE @MemberID int, @cnt int, @i int
DECLARE @Members TABLE(ID int, FullName varchar(70))
DECLARE @Scors TABLE(ID int, MemberID int, Score int)
DECLARE @Lottery TABLE(MemberID int)
DECLARE @LotteryResult TABLE(MemberID int)

INSERT INTO @Members VALUES(1, 'عضو 1')
INSERT INTO @Members VALUES(2, 'عضو 2')
INSERT INTO @Members VALUES(3, 'عضو 3')
INSERT INTO @Members VALUES(4, 'عضو 4')
INSERT INTO @Members VALUES(5, 'عضو 5')
INSERT INTO @Members VALUES(6, 'عضو 6')
INSERT INTO @Members VALUES(7, 'عضو 7')
INSERT INTO @Members VALUES(8, 'عضو 8')
INSERT INTO @Members VALUES(9, 'عضو 9')
INSERT INTO @Members VALUES(10, 'عضو 10')

INSERT INTO @Scors VALUES(1, 1, 1)
INSERT INTO @Scors VALUES(2, 2, 2)
INSERT INTO @Scors VALUES(3, 3, 5)
INSERT INTO @Scors VALUES(4, 4, 8)
INSERT INTO @Scors VALUES(5, 5, 1)
INSERT INTO @Scors VALUES(6, 6, 1)
INSERT INTO @Scors VALUES(7, 7, 3)
INSERT INTO @Scors VALUES(8, 8, 30)
INSERT INTO @Scors VALUES(9, 9, 2)
INSERT INTO @Scors VALUES(10, 10, 7)

DECLARE GetRecords cursor local static For
SELECT MemberID, Score FROM @Scors
OPEN GetRecords
FETCH NEXT FROM GetRecords INTO @MemberID, @cnt
WHILE @@fetch_status = 0
BEGIN
SET @i = 1
WHILE @i <= @cnt
BEGIN
INSERT INTO @Lottery(MemberID) VALUES(@MemberID)
SET @i = @i + 1
END
FETCH NEXT FROM GetRecords INTO @MemberID, @cnt
END
CLOSE GetRecords
DEALLOCATE GetRecords

DECLARE GetResults cursor local static For
SELECT MemberID FROM @Lottery ORDER BY NEWID()
OPEN GetResults
SET @cnt = 3
SET @i = 1
FETCH NEXT FROM GetResults INTO @MemberID
WHILE (@@fetch_status = 0) and (@i <= @cnt)
BEGIN
IF NOT EXISTS(SELECT MemberID FROM @LotteryResult WHERE MemberID = @MemberID)
BEGIN
INSERT INTO @LotteryResult(MemberID) VALUES(@MemberID)
SET @i = @i + 1
END
FETCH NEXT FROM GetResults INTO @MemberID
END
CLOSE GetResults
DEALLOCATE GetResults

SELECT Members.*, Scors.Score FROM @LotteryResult AS LotteryResult INNER JOIN @Members AS Members
ON Members.ID = LotteryResult.MemberID INNER JOIN @Scors AS Scors
ON Members.ID = Scors.MemberID

baktash.n81@gmail.com
یک شنبه 06 اسفند 1391, 08:10 صبح
سلام دوست عزیز

می تونی اینجوری عمل کنی یعنی برای هر شخص بر اساس امتیازش یه تعداد عدد مثالا 10 رقمی ایجاد کنی بعد یه عدد 10 رقمی به صورت تصادفی (یک عدد تصادفی به ازائ هر رقم) ایجاد کنی ... اما اینجوری ممکنه برنده نداشته باشی پس به تولید عدد تصادفی ادامه بدی تا یه برنده پیدا بشه ...

mohsen.net
دوشنبه 07 اسفند 1391, 15:29 عصر
سلام
چون این مسئله جالب بود برام و پرکاربرد دنبال یک راه جدید گشتم
راه آقای سامانی روش خوبی هست اما برای تعداد رکورد بالا خیلی مناسب نیست و پیچیدگی زیادی داره

روش دیگه اینه که یک بازه عددی برای هر رکورد بر اساس میزان امتازش بسازیم
مثلا فرض کنید داده های ما شامل 2 فیلد id و rank هست . حالا فرض کنید فردی با شماره 1 دارای امتیاز5 باشه و فردی با شماره 2 امتیاز 95 داشته باشه . پس شانس شماره 2 ، 95% میشه .
ما دو فیلد جدید به داده ها اضافه می کنیم شامل شروع بازه و پایان بازه
برای نفر اول میشه 0 و 5
برای نفر دوم میشه 5 و 100



حالا یک عدد رندوم بین 0 تا 100 اگر انتخاب کنبم رکورد مورد نظر بر اساس امتیاز پیدا میشه


اما قسمت سختش ساخت این بازه ها توی SQL هست که با تو کد زیر این هم به سادگی انجام شده



DECLARE @randomVal INT=RAND()*(SELECT SUM([RANK]) FROM dbo.Table_3)

;WITH res AS(
SELECT tbl3.[ID]
,tbl3.[rank]
,(SELECT ISNULL(SUM(t3.[rank]),0) FROM dbo.Table_3 t3 WHERE t3.ID<tbl3.ID) AS StartRank
,(SELECT ISNULL(SUM(t3.[rank]),0) FROM dbo.Table_3 t3 WHERE t3.ID<tbl3.ID)+tbl3.[rank] AS EndRank
FROM [Test].[dbo].[Table_3] tbl3
)
SELECT * FROM res
WHERE @randomVal BETWEEN StartRank AND EndRank

hamid1988
دوشنبه 07 اسفند 1391, 16:36 عصر
ممنون
میشه قسمت Sql رو بیشتر توضیح بدید؟

mohsen.net
دوشنبه 07 اسفند 1391, 22:00 عصر
اول یک عدد بین 0 و جمع امتیاز ها پیدا می کنیم (خط اول)

سپس برای هر رکورد مقدار شروع و پایان بازه امتیاز های بدست آورده اش را حساب می کنیم (Select اول)
آخرش هم می بینیم عدد پیدا شده اول تو چه بازه ای قرار می گیره و مال کدام رکورد میشه (select دوم)