Метод 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
Сравнително добро заместване на "order by rand()" в MySQL,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;
Има и 5ти метод с count(*) на таблицата и "LIMIT 1,".rand(0,$total-1); -- правят се толкова заявки колко реда ти трябват.
Да адаша е прав за този пропуск и този метод работи.
Междо другото го правих с count и е по- добре, но не ми допада метода на двете заявки. Преди доста години пробвах с count(*)(2 заявки) и се държеше МНОГО по- добре от order by rand()(с таблица от милиони редове), но така и не ми допадна идеята, че го правя с 2 заявки.
PS: може и в една заявка да се вкара със subquery
А производителнсота как е с тия варианти, защото определено като тежеста е в базата нещата не са много красиви. Според мен ако черната работа се остави на апликацията а не на базата положението ще е по приятно.