دارم روی یه اسکریپت کار می کنم که در اون به یه سطر تصادفی از mysql احتیاج دارم. خوب خود mysql راه خوبی برای این کار نداره و نمی شه از تابع های mysql در این زمینه انتظار کار خوبی داشت. اما تنها راهی که وجود داره اینه:

select * from TABLE order by rand() limit 1

اما بر پابه ی این مطلب این query بسیار کند (حدود ۷۱۷ ثانیه برای جدولی با تعداد سطر های ۲،۳۹۴،۹۶۸) و غیر قابل استفاده هستس و رسما استفاده از این هیچ دلیل منطقی نداره. خوب می خوام یه راه بهتری بهتون پیشنهاد کنم، البته با دو query اما بسیار سریع تر. خوب اول چیزی که لازم دارم تعداد کل سطر های موجود در جدول هستش که با این query به دست می یاد:

select Count(*) as `C` from TABLE

اما حالا می تونیم یه سطر به صورت تصادفی از جدول به دست بیاریم به این صورت که یه عدد تصادفی بین ۰ و تعداد سطر های جدول – ۱ با استفاده از زبونی که استفاده می کنیم به دست می یاریم و اسم اون رو N قرار می دیم. اما سطر مورد نظر با استفاده از query زیر به دست می یاد:

select * from TABLE limit N,1

اما برای این که دیگه هیچ سوالی نمونده باشه یک بار کل کار رو با php می نویسم:

<?php
$con = mysqli_connect("host", "user", "pass", "db");
$sqlRes_total = mysqli_query($con, "SELECT COUNT(*) as `C` FROM `TABLE`");
$total = mysqli_fetch_object($sqlRes_total)->C;
$random = rand(0, $total-1);
$sqlRes_row = mysqli_query($con, "SELECT * FROM `TABLE` LIMIT {$random},1");
$row = mysqli_fetch_object($sqlRes_row);
print_r($row);
mysqli_close($con);
?>

اما یه چیز دیگه فرض کنید شما یه جدول دارید که توی اون ۱۰۰،۰۰۰ سطر دارید. خوب به نظر من اگه بین ۵۰۰۰ سطر آخر هم یه سطر به صورت تصادفی داشته باشین بسته. پس خیلی راحت می شه query اول رو حذف کرد و به جای N از ۴۹۹۹ استفاده کرد.