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

MySQL/PostgreSQL/SQLite/Oracle/M$SQL/....

Модератор: terminus

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

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

Непрочитанное сообщение ProFTP » 2010-07-25 8:01:24

есть запрос:

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


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) 











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






но как это сделать для моего запроса?
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

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

Непрочитанное сообщение ProFTP » 2010-07-27 17:12:28

только что попробовал на таблице в 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к записей...
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

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

Непрочитанное сообщение zg » 2010-07-29 19:11:46

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

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)