მეთოდი 1:
SELECT * FROM `table` ORDER BY RAND() LIMIT 0,1;
როგორც სტატიის ავტორი წერს, მეთოდის პრობლემა მისი შესრულების დროა. MySQL-ს ყველა ჩანაწერი დროებით ცხრილში გადააქვს, თითოეულს ანიჭებს რაღაც შემთხვევით ინდექსს სორტირებისთვის. შემდეგ შედეგებს ასორტირებს და აბრუნებს პირველ ჩანაწერს.
მეთოდი 2:
უდიდესი და უმცირესი id-ის გასაგებად MAX() და MIN() ფუნქციები გამოვიყენოთ.
$range_result = mysql_query( " SELECT MAX(`id`) AS max_id , MIN(`id`) AS min_id FROM `table` ");
$range_row = mysql_fetch_object( $range_result );
$random = mt_rand( $range_row->min_id , $range_row->max_id );
$result = mysql_query( " SELECT * FROM `table` WHERE `id` >= $random LIMIT 0,1 ");
მეთოდი 3:
LIMIT ორ არგუმენტს იღებს. მაგალითად LIMIT 5,10 დააბრუნებს ჩანაწერებს 6-დან 15-მდე. ათვლა 0-დან იწყება. პირველი არგუმენტი offset-ია (არ ვიცი როგორ ითარგმნება), ხოლო მეორე – offset-დან ათვლილი წამოსაღები ჩანაწერების მაქსიმალური რაოდენობა.
რომ გამოვთვალოთ offset პირველ ჩანაწერამდე – დავაგენერიროთ შემთხვევითი რიცხვი MySQL-ის RAND() ფუნქციის საშუალებით. შემდეგ მიღებული რიცხვი გადავამრავლოთ ცხრილში არსებულ ჩანაწერთა რაოდენობას (ამ რაოდენობას COUNT() ფუნქციის მივიღებთ). რადგან LIMIT მხოლოდ მთელ რიცხვებს იღებს არგუმენტებად, ეს ნამრავლი უნდა დავამრგვალოთ – გამოვიყენოთ FLOOR() ფუნქცია.
FLOOR() არითმეტიკული ფუნქციაა, რომელიც გამოთვლის უდიდეს მთელ რიცხვს გადაცემულ პარამეტრამდე. საბოლოოდ, კოდს ასეთი სახე ექნება:
$offset_result = mysql_query( " SELECT FLOOR(RAND() * COUNT(*)) AS `offset` FROM `table` ");
$result = mysql_query( " SELECT * FROM `table` LIMIT $offset, 1 " );
მეთოდი 4:
SELECT * FROM `table` WHERE id >= (SELECT CEILING( MAX(id) * RAND()) FROM `table` ) ORDER BY id LIMIT 1;
სტატიის ავტორმა მეთოდების სისწრაფეები შეადარა და სოფტის და ჰარდის სპეციპიკაციებს თუ არ ჩავუღრმავდებით, მიახლოებით ასეთი შედეგი მიიღება:
სირბილაძის წკგ მეთოდები არ წავა? 🙂
ძალიან მომწონს საიტის დომეინი 🙂
და ისე მთელი პოსტები რომ გამოდის read more ქონდეს არ ჯობს?
ეს თემა შენ დაწერე? 🙂 ასეთ ლამაზ თემას მხოლოდ ჭეშმარიტი სამურაი გაჩითავდა 🙂 😛
blogroll-ში დაგამატებ თუ არ გეწყინბა? 😀
:))) არ მეწყინება
არა მე არ დამიწერია.. უფრო ვთარგმნე. პოსტშიც არის ორიგინალის ლინკი.
რაღაც გული არ მიმდის წკგ-ებზე 😀
მაგ სტატიაზე კი არა ვორდპრესის თემაზე ვამბობ 🙂
ბლოგი samurai, პერსონალური girl 😀 – ფერების მიხედვით 😀
აუფ ჩემი სურათი რა დიდის ამბით ეხატება წავედი wordpress.com -ზე …
ხომ. სკინი ჩემი დახატულია, თუ ეს მკითხე.
SELECT * FROM `table` WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM `table` ) ORDER BY id LIMIT 1;
აქ შეცდომაა, FLOOR ფუნქციის ნაცვლად CEILING უნდა იყოს, წინააღმდეგ შემთხვევაში ბოლო ელემენტი რჩება თამაშს გარეთ 🙂
ყველაზე მარტივი გამოსავალი ეს არის:
SELECT * FROM `table` ORDER BY rand() LIMIT 1;
@linguistuss
სწორი შენიშვნაა 🙂 მეოთხე მეთოდში ბოლო ჩანაწერს ვკარგავთ დამრგვალების გამო. პოსტსაც ჩავასწორებ 🙂