इसे आजमाएं:
SELECT *
FROM (
SELECT @cnt := COUNT(*) + 1,
@lim := 10
FROM t_random
) vars
STRAIGHT_JOIN
(
SELECT r.*,
@lim := @lim - 1
FROM t_random r
WHERE (@cnt := @cnt - 1)
AND RAND(20090301) < @lim / @cnt
) i
यह MyISAM
. पर विशेष रूप से कुशल है (COUNT(*)
. के बाद से तत्काल है), लेकिन यहां तक कि InnoDB
. में भी यह 10
है ORDER BY RAND()
. से कई गुना अधिक कुशल ।
यहां मुख्य विचार यह है कि हम क्रमबद्ध नहीं करते हैं, बल्कि इसके बजाय दो चर रखते हैं और running probability
की गणना करते हैं वर्तमान चरण पर चुनी जाने वाली पंक्ति का।
अधिक विवरण के लिए मेरे ब्लॉग में यह लेख देखें:
अपडेट करें:
यदि आपको केवल एक यादृच्छिक रिकॉर्ड का चयन करने की आवश्यकता है, तो यह प्रयास करें:
SELECT aco.*
FROM (
SELECT minid + FLOOR((maxid - minid) * RAND()) AS randid
FROM (
SELECT MAX(ac_id) AS maxid, MIN(ac_id) AS minid
FROM accomodation
) q
) q2
JOIN accomodation aco
ON aco.ac_id =
COALESCE
(
(
SELECT accomodation.ac_id
FROM accomodation
WHERE ac_id > randid
AND ac_status != 'draft'
AND ac_images != 'b:0;'
AND NOT EXISTS
(
SELECT NULL
FROM accomodation_category
WHERE acat_id = ac_category
AND acat_slug = 'vendeglatohely'
)
ORDER BY
ac_id
LIMIT 1
),
(
SELECT accomodation.ac_id
FROM accomodation
WHERE ac_status != 'draft'
AND ac_images != 'b:0;'
AND NOT EXISTS
(
SELECT NULL
FROM accomodation_category
WHERE acat_id = ac_category
AND acat_slug = 'vendeglatohely'
)
ORDER BY
ac_id
LIMIT 1
)
)
यह मान लेता है कि आपका ac_id
कमोबेश समान रूप से वितरित किए जाते हैं।