SQLite - ترتيب بواسطة Rand ()
-
12-09-2019 - |
سؤال
في 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 التي هي مفهرف افتراضي.