السلام عليكم ورحمة الله وبركاته ....
كيف أستطيع الحصول على سطر عشوائي من جدول باستخدام تعليمة select
في MySQL أستخدم:
select * from MyTable order by RAND() limit 1
السلام عليكم ورحمة الله وبركاته ....
كيف أستطيع الحصول على سطر عشوائي من جدول باستخدام تعليمة select
في MySQL أستخدم:
select * from MyTable order by RAND() limit 1
جرب هذا الكود داخل إجراء مخزن:
declare @i int set @i=rand()*100 select * from products where productID=@i
ببساطة يولد رقما عشوائيا بالدالة rand ويخزن قيمته في متغير بعد ضربها في 100
ومن ثم يستعمل القيمة المخزنة للاستعلام عنها
بالتوفيق بإذن الله :)
فكر بطريقة أخرى
و عليكم السلام و رحمة الله و بركاته
هذا الكود أيضاً مشابه ، لكنه يعيد القيمة حسب رقم ID موجود بالفعل وضمن إطار كافة أرقام ID المتاحة
Declare @RandomId int SELECT @RandomId = convert(int,RAND()* count(EmployeeID)) from Employees -- الحصول على رقم ID عشوائي SELECT * from Employees where EmployeeID = @RandomId
جزاكما الله خيراً ... لكن واجهتني المشكلة وهي أن السجل قدي يكون محذوف أي الأرقام ليست تسلسلية وبالتالي :
1 - 2 - 4 - 7 - 9 - 10 وهكذا أي سيكون هناك احتمال عدم إخراج سجل وبالتلي سأضطر لفحص هل السجل موجود أم لا فإن كان موجود فكل شيء تمام وإلا سأولد رقم عشواي آخر وهكذا ... فهل هناك طريقة أخرى أم أستخدم هذه وأتوكل على الله:
بالمناسبة أخي محمد عدلت قليلاً على طريقتك وجعلتها كما يلي فهل هذا أفضل:
SELECT @RandomId = convert(int, min(img_id) + RAND() * max(img_id)) from tbl_image
وجزاك الله خيراً أخي الغالي إسماعيل
بالنسبة للسؤال " فهل هناك طريقة أخرى أم أستخدم هذه وأتوكل على الله؟ فأظن والله تعالى أعلم أن تتوكل على الله تعالى وتستخدم أسلوب الاختبار هذا
بالنسبة لسؤال الآخر ، فنعم كودك أفضل :) أنه يجعل الحد الأدنى للقيمة الناتجة مساوية لأقل حد موجود ، أما أما الأول خاصتي فهو يجعل الحد الأدنى الناتج = 0 ، ولكن في حالة أنك ستضطر إلى استخدام كود اختبار للكشف عن القيمة هل هي موجودة أم لا فالكود الأكفء سيكون الكود الأول خاصتي ، لماذا ؟
لأن الكود الأول لو لاحظت داخله دالة استعلامية واحدة وهي COUNT اما الكود الثاني فداخله دالتان MIN , MAX ، وهذا سيطيل مدة الاستعلام ، طبعاً زمن بسيط جداً لكن أتكلم عن الكفاءة فقط ، وإلا فكودك أظهر نقطة ممتازة وهي مسألة الحد الأدني
وفقني الله وإياك للخير
وحتى تعم الفائدة ونتمم الموضوع فهذا هو السكريبت معه كود الاختبار
Declare @RandomId int GetRandomId: --SELECT @RandomId = convert(int,RAND()* count(EmployeeID)) from Employees /**/ SELECT @RandomId = convert(int, min(EmployeeID) + RAND() * max(EmployeeID)) from Employees /**/ SELECT * from Employees where EmployeeID = @RandomId IF @@ROWCOUNT = 0 BEGIN -- GOTO GetRandomId END
ملحوظة هذه العلامات "/**/" أو "--" في آخر العبارات لضبط تنسيق الكود في المنتدى وليس لها ضرورة ، وكذلك لن تضر حتى لو تركت في الكود
تم تعديل هذه المشاركة بواسطة محمد النحراوي في 8 نوفمبر 2005 في 02:39
الحل الأفضل والمنطقي :)
هذا الحل يعتمد على رقم الصف ، وليس على رقم ID لذلك يمكن استخدامه مع أي نوع بيانات وليس شرط INT ، ولا يتم عمل إختبار للقيمة الناتجة ، فقط مرة واحدة ويأتي بالمطلوب
Declare @RandomRow int SELECT @RandomRow = CONVERT(int, COUNT(CustomerID) * RAND() + 1) from Customers /**/ DECLARE _Cursor SCROLL CURSOR FOR SELECT * from Customers /**/ OPEN _Cursor FETCH ABSOLUTE @RandomRow FROM _Cursor /**/ CLOSE _Cursor DEALLOCATE _Cursor
السلام عليكم ورحمة الله
الموضوع قديم ولكن أحببت أن أضيف فائدة وهي في الحقيقة المرادفة للكود الأول الخاص بال MySQL الذي أورده الأخ إسماعيل
وطبعا تختصر الكثير مما سبق
SELECT * FROM mytable ORDER By NEWID()
انتهى :)
السلام عليكم اخوي محمد..
انا استخدمت الطريقة الاخيرة
ولكن عند تنفيذها كانت السجلات
المخزنة في قاعدة البيانات تظهر
متكررة يعني السجل الواحد يظهر اكثر من مره
لاني اسوي استدعاء لاكثر من سجل
هل في طرقه تخلي السجلات ماتتكرر؟؟؟
تحياتي،،
هناك شئ ما يدفعني دائما للتقدم
((حبي لوطني))
KSA
هذا الموضوع مغلق.