Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

30k MySQL तालिका से 3 यादृच्छिक रिकॉर्ड्स को एक क्वेरी द्वारा फ़िल्टर के साथ त्वरित रूप से कैसे चुनें?

बदसूरत, लेकिन त्वरित और यादृच्छिक। विशेष रूप से नीचे वर्णित ट्यूनिंग के साथ, बहुत तेजी से बदसूरत हो सकता है, इसलिए सुनिश्चित करें कि आप वास्तव में इसे इस तरह से चाहते हैं।

(SELECT Products.ID, Products.Name
FROM Products
    INNER JOIN (SELECT RAND()*(SELECT MAX(ID) FROM Products) AS ID) AS t ON Products.ID >= t.ID
WHERE Products.HasImages=1
ORDER BY Products.ID
LIMIT 1)

UNION ALL

(SELECT Products.ID, Products.Name
FROM Products
    INNER JOIN (SELECT RAND()*(SELECT MAX(ID) FROM Products) AS ID) AS t ON Products.ID >= t.ID
WHERE Products.HasImages=1
ORDER BY Products.ID
LIMIT 1)

UNION ALL

(SELECT Products.ID, Products.Name
FROM Products
    INNER JOIN (SELECT RAND()*(SELECT MAX(ID) FROM Products) AS ID) AS t ON Products.ID >= t.ID
WHERE Products.HasImages=1
ORDER BY Products.ID
LIMIT 1)

पहली पंक्ति जितनी बार होनी चाहिए उससे अधिक बार दिखाई देती है

यदि आपकी तालिका में आईडी के बीच बड़ा अंतर है, तो ऐसे अंतराल के ठीक बाद की पंक्तियों को इस क्वेरी द्वारा प्राप्त करने की अधिक संभावना होगी। कुछ मामलों में, वे अपेक्षा से अधिक बार महत्वपूर्ण रूप से दिखाई देंगे। इसे सामान्य रूप से हल नहीं किया जा सकता है, लेकिन एक सामान्य विशेष मामले के लिए एक समाधान है:जब किसी तालिका में 0 और पहली मौजूदा आईडी के बीच अंतर हो।

सबक्वेरी के बजाय (SELECT RAND()*<max_id> AS ID) कुछ इस तरह का उपयोग करें (SELECT <min_id> + RAND()*(<max_id> - <min_id>) AS ID)

डुप्लिकेट निकालें

क्वेरी, यदि इस रूप में उपयोग की जाती है, तो डुप्लिकेट पंक्तियों को वापस कर सकती है। UNION . का उपयोग करके इससे बचना संभव है UNION ALL . के बजाय . इस तरह डुप्लीकेट मर्ज हो जाएंगे, लेकिन क्वेरी अब बिल्कुल 3 पंक्तियों को वापस करने की गारंटी नहीं देती है। आप अपनी आवश्यकता से अधिक पंक्तियों को लाकर और बाहरी परिणाम को इस तरह सीमित करके उसके आसपास भी काम कर सकते हैं:

(SELECT ... LIMIT 1)
UNION (SELECT ... LIMIT 1)
UNION (SELECT ... LIMIT 1)
...
UNION (SELECT ... LIMIT 1)
LIMIT 3

हालांकि, इस बात की अभी भी कोई गारंटी नहीं है कि 3 पंक्तियां लाई जाएंगी। यह इसे और अधिक संभावना बनाता है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. मैं PHP में पूर्णांक और संख्यात्मक के रूप में MySQL से पूर्णांक और संख्यात्मक कॉलम कैसे वापस कर सकता हूं?

  2. Ubuntu 12.04 पर phpMyAdmin के साथ MySQL कैसे स्थापित करें?

  3. पीडीओ बाइंड_परम अपरिभाषित विधि है

  4. MySQL में CSV या XML आयात करें

  5. नवीनतम और दूसरे नवीनतम पद के बीच अंतर ढूँढना