رفتن به مطلب
  • 0

بدست آوردن کاربران برتر لیست در sql


fun_code

سوال

سلام
بنده کد sql نیاز دارم که بتونم در یه لیست که دارای فیلدهای نام و سطح کاربران است ، به ۳ نفر اول به ترتیب ۱۵ و ۱۰ و ۵ واحد اضافه کنم.
در واقع این مقادیر به سطح آن ها اضافه شود.
مشکل اینجا است که ممکن است ۴ نفر دارای سطح برابر بوده و همگی رتبه اول داشته باشند که کد مربوطه باید متوجه آن شود و تنها به ۳ کاربر اول مقادیر ۱۵ و ۱۰ و ۵ را اضافه نکند...
چون ۳ نفر اول با مقادیر برابر همگی رتبه اول رو دارند و نه رتبه های اول تا سوم.
 
برای مثال لیست زیر رو داریم :
نام    |    سطح
_____________
میلاد       10
امیر        10
محمود    10
ساسان     9
پوریا        9
عارف       8
نیما         7
شایان      6
 
در لیست بالا نفرات اول تا سوم به ترتیب زیر است :
نفرات اول : میلاد و امیر و محمود
نفرات دوم : ساسان و پوریا
نفر سوم : عارف
>> که به ترتیب باید به مقدار سطح نفرات اول 15 و نفرات دوم 10 و نفر سوم 5 واحد اضافه شود.
 
دلیل اینکه 3 کاربر رتبه اول و دو کاربر رتبه دوم رو کسب کردن برابر بودن مقدار سطح آن ها بود.
شاید میتونه الگوریتم کد sql اون اینجوری باشه 3 مقدار برتر سطح رو در لیست دربیاره
به مقدار سطح کاربرانی که مقدار سطحشان برابر با مقدار برتر هست 15 واحد و کاربرانی که مقدار سطحشان برابر با مقدار دوم هست 10 و کاربرانی که مقدار سطحشان برابر با مقدار سوم است 5 واحد اضافه کند.
>> میدونم که کدهای sql توانایی انجام این الگوریتم رو دارن...
به نظرم کامل و شفاف توضیح دادم.
آیا از دوستان کسی کدنویسی sql  بلده که کمکم کنه ؟ (چون تالار کدنویسی sql  نبود اینجا مطرح کردم تا بتونم از نتیجه اش در برنامه بیسیک فور اندرویدم استفاده کنم)

پیشاپیش از راهنمایی شما سپاسگزارم
لینک ارسال
به اشتراک گذاری در سایت های دیگر

2 پاسخ به این سوال تاکنون داده شده است

ارسال های توصیه شده

کار زیاد سختی نیست عزیز. یه خورده خلاقیت نیاز داره. چندتا مسئاله اینجا خیلی مهمه.

1- ممکنه اعداد سطح فلان بیشتر از یکی باشن. اینجا یکتایی مطرح میشه که دستورش DISTINCT هست.

2- با یه دستور کارتون راه نمیوفته:malih:

خب. حالا باید چیکار کرد. به دقت به چیزایی که مینویسم توجه کنید.

طبق نکته اول شما باید بیاین و لیست یکتای سه تا سطح اول رو دربیارید که ببینید سطحاتون چیا هستن. کوئری زیر این کارو میکنه. فرض کنیم فیلد سطح با اسم level باشه.

SELECT DISTINCT level FROM yourtbl LIMIT 3

دستور بالا میاد و سه تا سطح یکتای 10 و 9 و 8 رو برمیگردونه که این رو توی یه آرایه میریزین. البته فرض خیلی مهم اینه که سطح ها از بزرگ به کوچیک مرتب شده و دقیقا شبیه همونی هست که تو پست آوردین. در غیر این صورت کارتون پیچیده تر میشه و باید دستورات دیگه ی هم اضافه بشه به کوئریتون..

خب تا اینجا ما سه تا سطح رو توی یه آرایه داریم. سطح 10 و سطح 9 و سطح 8.

حالا کافیه با کنترل کردن فیلد سطح سطحا رو آپدیت کنیم. کوئری زیر میاد و سطحا رو آپدیت میکنه. البته دیگه خودتون سه تا عدد رو مرتب کنید که از بزرگ به کوچیک بتونید بهشون اضافه کنید.

مثلا برای آپدیت نفر اول که سطحش 10 هست به شکل زیر عمل کنید.

UPDATE yourtbl SET level=level+15 WHERE level=10

کوئری بالا میاد و سه تا سطحی که 10 هستنو میکنه 25. برای بقیه هم به همین شکله

لینک ارسال
به اشتراک گذاری در سایت های دیگر

در 25 دقیقه قبل، محمدرضا شاهپیری گفته است :

کار زیاد سختی نیست عزیز. یه خورده خلاقیت نیاز داره. چندتا مسئاله اینجا خیلی مهمه.

1- ممکنه اعداد سطح فلان بیشتر از یکی باشن. اینجا یکتایی مطرح میشه که دستورش DISTINCT هست.

2- با یه دستور کارتون راه نمیوفته:malih:

خب. حالا باید چیکار کرد. به دقت به چیزایی که مینویسم توجه کنید.

طبق نکته اول شما باید بیاین و لیست یکتای سه تا سطح اول رو دربیارید که ببینید سطحاتون چیا هستن. کوئری زیر این کارو میکنه. فرض کنیم فیلد سطح با اسم level باشه.


SELECT DISTINCT level FROM yourtbl LIMIT 3

دستور بالا میاد و سه تا سطح یکتای 10 و 9 و 8 رو برمیگردونه که این رو توی یه آرایه میریزین. البته فرض خیلی مهم اینه که سطح ها از بزرگ به کوچیک مرتب شده و دقیقا شبیه همونی هست که تو پست آوردین. در غیر این صورت کارتون پیچیده تر میشه و باید دستورات دیگه ی هم اضافه بشه به کوئریتون..

خب تا اینجا ما سه تا سطح رو توی یه آرایه داریم. سطح 10 و سطح 9 و سطح 8.

حالا کافیه با کنترل کردن فیلد سطح سطحا رو آپدیت کنیم. کوئری زیر میاد و سطحا رو آپدیت میکنه. البته دیگه خودتون سه تا عدد رو مرتب کنید که از بزرگ به کوچیک بتونید بهشون اضافه کنید.

مثلا برای آپدیت نفر اول که سطحش 10 هست به شکل زیر عمل کنید.


UPDATE yourtbl SET level=level+15 WHERE level=10

کوئری بالا میاد و سه تا سطحی که 10 هستنو میکنه 25. برای بقیه هم به همین شکله

 

سلام

ممنون از راهنماییتون

چون ناچار بودم انقدر بهش ور رفتم و دستورات sql رو تو نت جستجو کردم که بقول شما براحتی انجام شد.

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

درسته بهینه نیست اما کارم رو راه انداخت...

declare @a int , @b int , @c int

set @a=(SELECT DISTINCT TOP 1 [Level] FROM [DB].[dbo].[TU] order by Level desc)
UPDATE [DB].[dbo].[TU] SET lv=lv+15 WHERE Level=@a

set @b=(SELECT DISTINCT TOP 1 [Level] FROM [DB].[dbo].[TU] where Level<@a order by Level desc)
UPDATE [DB].[dbo].[TU] SET lv=lv+10 WHERE Level=@b

set @c=(SELECT DISTINCT TOP 1 [Level] FROM [DB].[dbo].[TU] where Level<@b order by Level desc)
UPDATE [DB].[dbo].[TU] SET lv=lv+5 WHERE Level=@c

 

لینک ارسال
به اشتراک گذاری در سایت های دیگر

بایگانی شده

این موضوع بایگانی و قفل شده و دیگر امکان ارسال پاسخ نیست.

مهمان
این موضوع برای عدم ارسال قفل گردیده است.
  • کاربران آنلاین در این صفحه   0 کاربر

    • هیچ کاربر عضوی،در حال مشاهده این صفحه نیست.
×
×
  • اضافه کردن...