შემთხვევითი ჩანაწერის ამორჩევა მონაცემთა ბაზის ცხრილიდან
მეთოდი 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 FLOOR( MAX(id) * RAND()) FROM `table` ) ORDER BY id LIMIT 1;
სტატიის ავტორმა მეთოდების სისწრაფეები შეადარა და სოფტის და ჰარდის სპეციპიკაციებს თუ არ ჩავუღრმავდებით, მიახლოებით ასეთი შედეგი მიიღება:
Tags: random, SQL, ოპტიმიზაცია


January 7th, 2009 at 5:33 pm
სირბილაძის წკგ მეთოდები არ წავა?
ძალიან მომწონს საიტის დომეინი
და ისე მთელი პოსტები რომ გამოდის read more ქონდეს არ ჯობს?
ეს თემა შენ დაწერე?
ასეთ ლამაზ თემას მხოლოდ ჭეშმარიტი სამურაი გაჩითავდა
blogroll-ში დაგამატებ თუ არ გეწყინბა?
January 7th, 2009 at 5:38 pm
:))) არ მეწყინება
არა მე არ დამიწერია.. უფრო ვთარგმნე. პოსტშიც არის ორიგინალის ლინკი.
რაღაც გული არ მიმდის წკგ-ებზე
January 7th, 2009 at 6:54 pm
მაგ სტატიაზე კი არა ვორდპრესის თემაზე ვამბობ
ბლოგი samurai, პერსონალური girl
- ფერების მიხედვით
აუფ ჩემი სურათი რა დიდის ამბით ეხატება წავედი wordpress.com -ზე …
January 7th, 2009 at 7:42 pm
ხომ. სკინი ჩემი დახატულია, თუ ეს მკითხე.
April 19th, 2009 at 12:13 am
SELECT * FROM `table` WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM `table` ) ORDER BY id LIMIT 1;
აქ შეცდომაა, FLOOR ფუნქციის ნაცვლად CEILING უნდა იყოს, წინააღმდეგ შემთხვევაში ბოლო ელემენტი რჩება თამაშს გარეთ
April 20th, 2009 at 2:16 am
ყველაზე მარტივი გამოსავალი ეს არის:
SELECT * FROM `table` ORDER BY rand() LIMIT 1;
April 22nd, 2009 at 5:36 pm
@linguistuss
მეოთხე მეთოდში ბოლო ჩანაწერს ვკარგავთ დამრგვალების გამო. პოსტსაც ჩავასწორებ
სწორი შენიშვნაა