الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

قيم عشوائية

مغلق
بدأه إسماعيل عنجريني في 7 نوفمبر 2005 · 10 رد · 1,288 مشاهدة · في قواعد بيانات Microsoft SQL Server
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته ....

كيف أستطيع الحصول على سطر عشوائي من جدول باستخدام تعليمة select

في MySQL أستخدم:

select * from MyTable order by RAND() limit 1
#2

جرب هذا الكود داخل إجراء مخزن:

declare @i int
set @i=rand()*100

select * from products where productID=@i

ببساطة يولد رقما عشوائيا بالدالة rand ويخزن قيمته في متغير بعد ضربها في 100

ومن ثم يستعمل القيمة المخزنة للاستعلام عنها

بالتوفيق بإذن الله :)

فكر بطريقة أخرى

#3

و عليكم السلام و رحمة الله و بركاته

هذا الكود أيضاً مشابه ، لكنه يعيد القيمة حسب رقم ID موجود بالفعل وضمن إطار كافة أرقام ID المتاحة

Declare @RandomId int

SELECT @RandomId = convert(int,RAND()* count(EmployeeID)) from Employees -- الحصول على رقم ID عشوائي

SELECT * from Employees where EmployeeID = @RandomId
#4

جزاكما الله خيراً ... لكن واجهتني المشكلة وهي أن السجل قدي يكون محذوف أي الأرقام ليست تسلسلية وبالتالي :

1 - 2 - 4 - 7 - 9 - 10 وهكذا أي سيكون هناك احتمال عدم إخراج سجل وبالتلي سأضطر لفحص هل السجل موجود أم لا فإن كان موجود فكل شيء تمام وإلا سأولد رقم عشواي آخر وهكذا ... فهل هناك طريقة أخرى أم أستخدم هذه وأتوكل على الله:

بالمناسبة أخي محمد عدلت قليلاً على طريقتك وجعلتها كما يلي فهل هذا أفضل:

SELECT @RandomId = convert(int, min(img_id) + RAND() * max(img_id)) from tbl_image
#5

وجزاك الله خيراً أخي الغالي إسماعيل

بالنسبة للسؤال " فهل هناك طريقة أخرى أم أستخدم هذه وأتوكل على الله؟ فأظن والله تعالى أعلم أن تتوكل على الله تعالى وتستخدم أسلوب الاختبار هذا

بالنسبة لسؤال الآخر ، فنعم كودك أفضل :) أنه يجعل الحد الأدنى للقيمة الناتجة مساوية لأقل حد موجود ، أما أما الأول خاصتي فهو يجعل الحد الأدنى الناتج = 0 ، ولكن في حالة أنك ستضطر إلى استخدام كود اختبار للكشف عن القيمة هل هي موجودة أم لا فالكود الأكفء سيكون الكود الأول خاصتي ، لماذا ؟

لأن الكود الأول لو لاحظت داخله دالة استعلامية واحدة وهي COUNT اما الكود الثاني فداخله دالتان MIN , MAX ، وهذا سيطيل مدة الاستعلام ، طبعاً زمن بسيط جداً لكن أتكلم عن الكفاءة فقط ، وإلا فكودك أظهر نقطة ممتازة وهي مسألة الحد الأدني

وفقني الله وإياك للخير

#6

وحتى تعم الفائدة ونتمم الموضوع فهذا هو السكريبت معه كود الاختبار

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

#7

الحل الأفضل والمنطقي :)

هذا الحل يعتمد على رقم الصف ، وليس على رقم 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
#9

السلام عليكم ورحمة الله

الموضوع قديم ولكن أحببت أن أضيف فائدة وهي في الحقيقة المرادفة للكود الأول الخاص بال MySQL الذي أورده الأخ إسماعيل

وطبعا تختصر الكثير مما سبق

SELECT * FROM mytable ORDER By NEWID()

انتهى :)

#10

السلام عليكم اخوي محمد..

انا استخدمت الطريقة الاخيرة

ولكن عند تنفيذها كانت السجلات

المخزنة في قاعدة البيانات تظهر

متكررة يعني السجل الواحد يظهر اكثر من مره

لاني اسوي استدعاء لاكثر من سجل

هل في طرقه تخلي السجلات ماتتكرر؟؟؟

تحياتي،،

هناك شئ ما يدفعني دائما للتقدم

((حبي لوطني))

KSA

#11
SELECT Distinct * FROM mytable ORDER By NEWID()

سلام

هذا الموضوع مغلق.

مواضيع مشابهة