Метод 1
select @rand:=CEIL(MAX(uid)*RAND()) AS uid from tablica;select ddate,title,url,visits from tablica where uid>=@rand order by uid limit 10;
Метод 2
SELECT uid,ddate,title,url,visits FROM tablica T JOIN (SELECT FLOOR(MAX(uid)*RAND()-1024) AS ID FROM tablica) AS x ON T.uid >= x.ID LIMIT 10;
Метод 3
SELECT uid,ddate,title,url,visits FROM tablica T JOIN (SELECT MAX(uid) AS ID FROM tablica) AS x ON T.uid >= FLOOR(x.ID*RAND()) LIMIT 10;
Метод 4
SELECT uid,ddate,title,url,visits FROM tablica t JOIN (SELECT(FLOOR(max(uid) * rand())) as maxid FROM tablica) as tt on t.uid >= tt.maxid LIMIT 10;
3 отговора
Има и 5ти метод с count(*) на таблицата и „LIMIT 1,“.rand(0,$total-1); – правят се толкова заявки колко реда ти трябват.
Да адаша е прав за този пропуск и този метод работи.
Междо другото го правих с count и е по- добре, но не ми допада метода на двете заявки. Преди доста години пробвах с count(*)(2 заявки) и се държеше МНОГО по- добре от order by rand()(с таблица от милиони редове), но така и не ми допадна идеята, че го правя с 2 заявки.
PS: може и в една заявка да се вкара със subquery
А производителнсота как е с тия варианти, защото определено като тежеста е в базата нещата не са много красиви. Според мен ако черната работа се остави на апликацията а не на базата положението ще е по приятно.
Logged in as {{omniform_current_user_display_name}}. Edit your profile. Log out? Required fields are marked *
Your email address will not be published. Required fields are marked *
Comments are closed.
You must be logged in to post a comment.