बदसूरत, लेकिन त्वरित और यादृच्छिक। विशेष रूप से नीचे वर्णित ट्यूनिंग के साथ, बहुत तेजी से बदसूरत हो सकता है, इसलिए सुनिश्चित करें कि आप वास्तव में इसे इस तरह से चाहते हैं।
(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 पंक्तियां लाई जाएंगी। यह इसे और अधिक संभावना बनाता है।