Страница 1 из 1

[MySQL] выбор случайных записей

Добавлено: 2010-07-25 8:01:24
ProFTP
есть запрос:

Код: Выделить всё


SELECT   t2.id_gr, t2.name_group, t2.description														   

                            FROM groups_contents AS t1   

                            inner JOIN groups AS t2

                            ON t1.id_gr = t2.id_gr

                           WHERE t1.id_co = ? 

                                     LIMIT 10 





как сделать чтобы было 10 случайных записей?



таблицы не маленькие...



нашел аналогичные темы:

http://forum.vingrad.ru/forum/topic-119426/0.html

http://forum.vingrad.ru/forum/topic-133667/0.html

http://jan.kneschke.de/projects/mysql/order-by-rand/





но не понял как сделать в моем случае...



ещё один способ:



Предположим надо выбрать из таблицы "cooccurrences" 2 случайных записей.

$cnt нам известен,. Скриптом генерим два случайных числа rand()%$cnt. предположим получились 15,20




Код: Выделить всё


		SELECT * FROM (SELECT @row:=@row+1 as rownum, cooccurrences.* FROM (SELECT @row=0)r,cooccurrences) ranked WHERE rownum IN(15,20) 











Получается, что запрос нумерует все записи таблицы и выбирает номера, которые нам нужны. Во многих случаях это должно работать весьма быстро.






но как это сделать для моего запроса?

Re: [MySQL] выбор случайных записей

Добавлено: 2010-07-27 17:12:28
ProFTP
только что попробовал на таблице в 60 000 значений, запрос - выполнялся около 0.1 - 0.09 что есть не красиво...?? (правда потом быстрее))

хотел сделать оптимизированно чтобы не возвращатся к этому вопросу!
и видел на этом форуме делали подобные запросы оптимизированные...

короче, я сделал так

Код: Выделить всё

SELECT
id_gr
FROM (
SELECT id_gr
FROM groups_contents
WHERE id_co = 79
ORDER BY RAND()
LIMIT 10 
) groups_contents
от сюда

Код: Выделить всё

select * from groups where in id_gr (bla.bla,etc);

этот запрос не выводит ничего:

Код: Выделить всё

SELECT * FROM (SELECT @row:=@row+1 as rownum, content.* FROM (SELECT @row=0)r,content) ranked WHERE rownum IN(15,20) 
что такое 15,20, это PRIMARY KEY ?
у меня их 2...


такой запрос выводит:

Код: Выделить всё

mysql> SELECT * FROM content WHERE id_co > rand()*(max(id_co)-min(id_co)) + min(id_co) ;
ERROR 1111 (HY000): Invalid use of group function


я пока остановился на этом:

Код: Выделить всё

SELECT
id_gr
FROM (
SELECT id_gr
FROM groups_contents
WHERE id_co = 79
ORDER BY RAND()
LIMIT 10 
) groups_contents

Код: Выделить всё

select * from groups where in id_gr (bla.bla,etc);
он вродебы по быстрее, думаю достаточно, хватит на 500к записей...

Re: [MySQL] выбор случайных записей

Добавлено: 2010-07-29 19:11:46
zg

Код: Выделить всё

mysql> select * from mysql.help_category where rand() > 0.5 order by rand() limit 10;
+------------------+-------------------------+--------------------+-----+
| help_category_id | name                    | parent_category_id | url |
+------------------+-------------------------+--------------------+-----+
|                5 | Plugins                 |                 33 |     |
|               27 | Utility                 |                 33 |     |
|                6 | MBR                     |                 32 |     |
|                7 | Control flow functions  |                 36 |     |
|               30 | Date and Time Functions |                 36 |     |
|               32 | Geographic Features     |                 33 |     |
|               11 | Encryption Functions    |                 36 |     |
|               12 | LineString properties   |                 32 |     |
|                3 | WKT                     |                 32 |     |
|               36 | Functions               |                 33 |     |
+------------------+-------------------------+--------------------+-----+
10 rows in set (0.03 sec)

mysql> select * from mysql.help_category where rand() > 0.5 order by rand() limit 10;
+------------------+------------------------+--------------------+-----+
| help_category_id | name                   | parent_category_id | url |
+------------------+------------------------+--------------------+-----+
|                9 | Account Management     |                 33 |     |
|               36 | Functions              |                 33 |     |
|               29 | Geometry relations     |                 32 |     |
|               23 | Geometry constructors  |                 32 |     |
|               27 | Utility                |                 33 |     |
|               28 | Language Structure     |                 33 |     |
|               18 | Bit Functions          |                 36 |     |
|                7 | Control flow functions |                 36 |     |
|               19 | Table Maintenance      |                 33 |     |
|               10 | Point properties       |                 32 |     |
+------------------+------------------------+--------------------+-----+
10 rows in set (0.00 sec)