PDA

View Full Version : انتخاب رکورد ها به صورت نامرتب و دلخواه



prince-of-persia
یک شنبه 19 شهریور 1385, 11:09 صبح
سلام

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

من یک دستور sql می خوام که برای یک فیلد خاص مثلا فیلد code تعدادی ورودی بهش بدم و اون بدون در نظر گرفتن ترتیب درج اون ها در دیتابیس و دقیقا به همون ترتیبی که من مقدار وارد کردم دستور select رو برای من انجام بده.

مثلا اگر در بانک من مقادیر : (اعداد در فیلد کد قرار دارند)
1 ali
2 reza
3 kamran
4 kambiz
وارد شده است دستور sql ایی بنویسم که بهش بدم 4 1 3 2 (منظورم نامنظم بودن است )و اون برای من برگردونه
4 kambiz
1 ali
3 kamran
2 reza

من برای مرتب کردن فیلد های یک گرید بدون در نظر گرفتن یک فیلد از جدول به این کار نیاز دارم.
و باید بگم فقط خودم ترتیب رکورد ها رو میدونم.

البته باید بگم که من از دستور زیر هم استفاده کردم:

SELECT name, detail, price, code
FROM project_archive
WHERE (code IN (4, 1, 3, 2))

حالا در نظر بگیردی که در رکورد های مختلف برای فیلد کد مقادیر :
1
2
3
4
5
6
7
8
...
وارد شده باشد در این صورت خروجی دستور فوق به همین ترتیب خواهد بود یعنی:
1
2
3
4
و این در صورتی است که میخواهم خروجی به صورت
4
1
3
2
باشد

با تشکر

prince-of-persia
یک شنبه 19 شهریور 1385, 11:45 صبح
هیچ کس تاحالا گیریدشو به صورت دلخواه مرتب نکرده؟

blueface
یک شنبه 19 شهریور 1385, 13:39 عصر
سلام:
شاید درست متوجه منظورت نشده باشم ولی اگر هدفت فقط مرتب کردن گرید هست چرا از این امکان خود گرید استفاده نمی کنی، که بهت اجازه میده با هر ستونی که بخوای اونو مرتب کنی

prince-of-persia
یک شنبه 19 شهریور 1385, 16:57 عصر
بله درسته شما اشتباه متوجه شدید
البته این بخاطر اشتباه در بیان صورت مساله است
اگر جاییش مبهمه بگید تا بیشتر توضیح بدم

prince-of-persia
دوشنبه 20 شهریور 1385, 08:37 صبح
اگر نظری هم برای این کار (top 10( دارید بگید
به هر حال این مشکلیه که خیلی ها ممکنه بهش بر بخورند.

اَرژنگ
دوشنبه 20 شهریور 1385, 08:46 صبح
فرض کنیم جواب کوائری شما در یک داتاتیبل برگردانده شده.
شما میتونید یک آرایه [۴،۳،۵،۲،۱] (برایه مثال استفاده کنید) و بر حسبه آرایه داتا‌روها را بگیرید.

یک مثال کامل سرهم میکنم

reza_rad
دوشنبه 20 شهریور 1385, 09:11 صبح
اگه شما اطلاعات رو بدون مرتب کردن بیرون بکشید خودش به همون ترتیبی که وارد دیتابیس شدن بیرون می کشدشون.

اگه هم باز نشد می تونید از یه فیلد timemodified توی جدولتون استفاده کنید. و همیشه سلکتتون رو بر اساس این فیلد مرتب کنید.مثلا اینجوری:
select * from table1 order by timemodified

prince-of-persia
دوشنبه 20 شهریور 1385, 09:11 صبح
آرژنگ جان اگر ممکنه توی messenger on بشو تا راحت تر بتونیم کار کنیم
--------------------
البته من به آرژنگ جان هم گفتم که نمیتونم از یک جدول جدید یا از یک فیلد جدید استفاده کنم
تنها چیز هایی که من میتونم داشته باشم یک دستور sql است و تعدادی عدد

prince-of-persia
دوشنبه 20 شهریور 1385, 09:17 صبح
آقای راد اگر ممکنه بیشتر توضیح بدید

reza_rad
دوشنبه 20 شهریور 1385, 09:28 صبح
آقای راد اگر ممکنه بیشتر توضیح بدید

شما یک فیلد توی جدولت اضافه کن و هروقت یک رکورد رو insert می کنی تاریخ اون لحظه رو هم وارد اون فیلد از جدول کن.
حالا هر وقت خواستی از جدول بخونی با همون order by ای که گفتم بخونش. اینجوری دقیقا به همون ترتیبی که وارد دیتابیس شده بیرون کشیده میشه.

prince-of-persia
دوشنبه 20 شهریور 1385, 09:50 صبح
ببینید اصلا برای من زمان و ترتیب درج مهم نیست
اجازه بدید مساله رو بیشتر باز کنم
ببینید من داخل سایتم یک سیستم امتیاز دهی دارم یعنی بر اساس تعداد دفعات مشاهده و تعداد دفعات دانلود مثلا یک نرم افزار و همچنین حداکثرتعداد دفعات مشاهده و حداکثر تعداد دفعات دانلود نرم افزار ها یک فرمول دارم که یک عدد از 0 تا 100 به من میده باید به این نکته توجه داشت که چون فرمول موجوده از یک سری ورودی های متغیر استفاده می کنه در نتیجه خروجی هم مدام در حال تغییر هست حالا به این فکر کنید که برای بدست آوردن این عدد 0 تا 100 که همون امتیاز یک نرم افزار هست چه محاسبات سنگینی (البته وقی که تعداد رکورد ها زیاد بسه) باید انجام داد
تازه بعد از اون یک تابع دارم که از نرم افزار ها 10 تایی که امتیاز بیشتری دارند انتخاب میکنه
پس با توجه به تغییراتی که مدام در امتیاز ها و در نتیجه بالا و پایین شدن 10 برتر انجام میشه نمیتونم امتیاز ها رو در جایی بنویسم در واقع با هر بار لود شدن صفحه امتیاز ها حساب میشه و سپس کد 10 تای برتر بدست میاد
حالا موقع اونه که من اون 10 تا رو نشون بدم اما دستوراتی که نوشتم همیشه محل درج رکورد ها رو در نظر می گیرند من روشی رو می خوام که این کارو برام انجام بده

ممنونم

sarami
دوشنبه 20 شهریور 1385, 10:01 صبح
پیرو سئوالتون تو بخش بانک اطلاعاتی نمونه برنامه ذیر رو دانلود کنین با استفاده از تابع رندوم و فیلد محاسبی نتیجه سورت نامرتبی از رکوردهاست....
دانلود نمونه برنامه (http://www.box.net/public/7crp3sdkdv)

reza_rad
دوشنبه 20 شهریور 1385, 10:14 صبح
تازه متوجه مشکلتون شدم:)

به اینصورت عمل کنید:


select '4',form_id from AWF_Form where form_id='1'
union
select '2',form_id from awf_form where form_id='8'
union
select '3',form_id from AWF_Form where form_id='24'

این نتایج رو بر اساس فیلد اول که همون امتیاز هست مرتب می کنه.
البته حواستون باشه اینجوری ننویسید:


select form_id,'4' from AWF_Form where form_id='1'
union
select form_id,'2' from awf_form where form_id='8'
union
select form_id,'3' from AWF_Form where form_id='24'

sarami
دوشنبه 20 شهریور 1385, 10:24 صبح
استاد ایشون میخوان تابع هیچ قانونی نباشه نتایج استخراجیشون یعنی 10 تای اول بصورت رندوم نمایش داده بشن

prince-of-persia
دوشنبه 20 شهریور 1385, 10:30 صبح
آقای sarami نظر آقای راد درسته و من می خ.ام اون 10 تا رو خودم انتخاب کنم و همونطور که گفتم بر اساس یک فرمول بدست می آورم و اتفاقا همین قانون مند بودن هست که مشکل ساز شده

reza_rad
دوشنبه 20 شهریور 1385, 10:40 صبح
استاد ایشون میخوان تابع هیچ قانونی نباشه نتایج استخراجیشون یعنی 10 تای اول بصورت رندوم نمایش داده بشن

sarami عزیز من از مشکل ایشون اینو متوجه شدم:
یه عددی تولید میشه برای هر رکورد که امتیاز رکورد هست و از اونجا که هی تغییر می کنه نمیشه توی دیتابیس ریخته بشه.
حالا رکوردهای مربوط به 10 تا عدد بالاتر بیرون کشیده میشن و باید بر اساس این امتیاز مرتب بشن.

درست متوجه شدم؟؟؟



آقای sarami نظر آقای راد درسته و من می خ.ام اون 10 تا رو خودم انتخاب کنم و همونطور که گفتم بر اساس یک فرمول بدست می آورم و اتفاقا همین قانون مند بودن هست که مشکل ساز شده


خب الان با کوئری ای که گفتم باید مشکلتون حل شده باشه
جای عدد هایی که نوشتم باید امتیازی رو که بدست اومده بذارید تا جواب بگیرید.

sarami
دوشنبه 20 شهریور 1385, 10:41 صبح
شما ده تای اول رو محاسبه و استخراج کنین سپس توسط نمونه ی بنده برای نمایش اطلاعات . بصورت تصادفی نمایش بدین به عبارتی پس از استخراج 10 تای اول ترتیب قرار گرفتن رو تصادفی ایجاد نمایید

prince-of-persia
دوشنبه 20 شهریور 1385, 10:43 صبح
آقای راد و دوستان عزیز یک دنیا تشکر بالاخره بعد از 2 روز این مشکل به بهترین نحو حل شد.کد زیر همان روش آقای راد است
SELECT '1', code
FROM project_archive
WHERE code = 1
UNION
SELECT '2', code
FROM project_archive
WHERE code = 8
UNION
SELECT '3', code
FROM project_archive
WHERE code = 2

امیدوارم که استفاده کنید حتما مواردی پیش میاد که بهش نیاز پیدا میکنید.
با تشکر