SQLite

2010-11-06 10 views
39

में यादृच्छिक पंक्ति (यों) का चयन करें MySQL में, आपको निम्न कथन से यादृच्छिक पंक्तियों का चयन कर सकते हैं एक्स:SQLite

SELECT * FROM table ORDER BY RAND() LIMIT X 

यह नहीं करता है, हालांकि, SQLite में काम करते हैं। क्या समकक्ष है?

+0

एक http://stackoverflow.com/questions/2279706/select-random-row-from-an-sqlite-table –

उत्तर

38

एक बहुत बेहतर प्रदर्शन उपयोग के लिए:

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

एसक्यूएल इंजन पहले लोड अनुमान स्मृति के लिए पंक्तियों के क्षेत्र फिर उन्हें सॉर्ट, यहाँ हम सिर्फ एक यादृच्छिक करना प्रत्येक पंक्ति के आईडी फ़ील्ड को सॉर्ट करें जो स्मृति में है क्योंकि यह अनुक्रमित है, फिर उनमें से अलग एक्स, और इन एक्स आईडी का उपयोग करके पूरी पंक्ति ढूंढें।

तो यह तालिका बढ़ने के साथ कम रैम और सीपीयू का उपभोग करता है!

+0

स्वीकार्य उत्तर से विधि 2 _ignignantly_ तेज था। धन्यवाद! –

+0

यह शानदार धन्यवाद है, मैंने स्वीकृत उत्तर अपडेट किया है :) –

+0

वाह !! ऐसा प्रदर्शन !!!! – Omid

53

SELECT * FROM table ORDER BY RANDOM() LIMIT X

+0

धन्यवाद, यह चाल –

+4

के लिए एक समान रूप से वितरित यादृच्छिक चर है रिकॉर्ड: यह काम कर रहा है, लेकिन बड़ी टेबल पर धीमा है। एक तेज़ तरीका (हालांकि काफी समान नहीं) होगा: 'चुनें * तालिका से जहां यादृच्छिक()% k = 0 LIMIT n; '। इसका दोष यह है कि निचले प्राथमिक कुंजी वाले रिकॉर्ड को चुनने का उच्च अवसर मिलता है। [यहां से लिया गया] (http://blog.rodolfocarvalho.net/2012/05/how-to-select-random-rows-from-sqlite.html) – ren

+2

हां, यह बड़ी टेबल पर धीमा हो जाएगा क्योंकि यह समाप्त होता है एक टेबल स्कैन मजबूर करना। एसक्यूएल में इस तरह की चीजें करना चाहते हैं। सबसे अच्छा तरीका आपके सामने के अंत में यादृच्छिक ऑफसेट चुनना होगा। – Donnie

0

सभी उत्तर यहां ORDER BY पर आधारित हैं। यह बड़े सेट के लिए बहुत अक्षम (यानी अनुपयोगी) है। इस मामले में 0.5 हिट मौका पाने के लिए WHERE खंड में केवल abs(CAST(random() AS REAL))/9223372036854775808 < 0.5 क्यों न रखें?

SELECT * 
FROM table 
WHERE abs(CAST(random() AS REAL))/9223372036854775808 < 0.5 

बड़ी संख्या में अधिकतम निरपेक्ष संख्या कि random() का उत्पादन कर सकते है। abs() ऐसा इसलिए है क्योंकि यह हस्ताक्षरित है। परिणाम 0 और 1.