سؤال

في MySQL، يمكنني استخدام وظيفة RAND ()، هل هناك أي بديل في SQLite 3؟

هل كانت مفيدة؟

المحلول

استخدام عشوائي():

SELECT foo FROM bar
  WHERE id >= (abs(random()) % (SELECT max(id) FROM bar))
  LIMIT 1;

تحرير (بواسطة QOP): منذ المستندات على sqlite autoincrement.تنص أعمدة ED على ما يلي:

خوارزمية اختيار ORID الطبيعية الموصوفة أعلاه سوف تولد متزايد ريال فريد من نوعه طالما أنك لا تستخدم أبدا الحد الأقصى لقيمة روضة ولا يمكنك حذف الإدخال الموجود في الجدول بأكبر روي. إذا قمت بحذف الصفوف، فقد يتم إعادة استخدام Rowids من الصفوف المحذوفة مسبقا عند إنشاء صفوف جديدة.

ما سبق صحيح فقط إذا لم يكن لديك INTEGER PRIMARY KEY AUTOINCREMENT العمود (سوف لا يزال يعمل بشكل جيد مع INTEGER PRIMARY KEY أعمدة). على أي حال، يجب أن يكون هذا أكثر محمولة / موثوقة:

SELECT foo FROM bar
  WHERE _ROWID_ >= (abs(random()) % (SELECT max(_ROWID_) FROM bar))
LIMIT 1;

ROWID, _ROWID_ و OID جميع الأسماء المستعارة لمعرف صف SQLite الداخلي.

نصائح أخرى

SELECT * FROM table ORDER BY RANDOM() LIMIT 1;

تم حلها:

SELECT * FROM table ORDER BY RANDOM() LIMIT 1;

للحصول على أداء أفضل بكثير استخدام هذا في SQLite:

SELECT * FROM table WHERE id IN (SELECT id FROM table ORDER BY RANDOM() LIMIT x) 

هذا ينطبق أيضا على MySQL. هذا يعمل بشكل أسرع لأنه محركات SQL تحميل أول حقول متوقعة من الصفوف إلى الذاكرة ثم فرزها, ، هنا نحن فقط تحميل ونشر حقل معرف الصفوف، ثم نحصل على X منهم، والعثور على صفوف كاملة من هذه المعرفات X التي هي مفهرف افتراضي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top