|
|
|
Выбор случайных фото
|
|||
|---|---|---|---|
|
#18+
Таблица базы данных содержит фотографии товаров, каждая запись в таблице имеет два поля - id(первичный ключ) и good_id(внешний ключ к соответствующей записи в таблице товаров). Необходимо случайным образом выбрать RAND_PHOTOS_NUM (напр. 3) фотографий. Выбранные фотографии не должны повторятсья. Общее число фотографий в таблице может оказаться меньше RAND_PHOTOS_NUM. Написал следующий код, но мне кажется все можно сделать гораздо проще. Пожалуйста посоветуйте как оптимизировать приведенный отрывок кода или скажите другое решение. Спасибо. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2005, 12:48 |
|
||
|
Выбор случайных фото
|
|||
|---|---|---|---|
|
#18+
TigranEмне кажется все можно сделать гораздо проще.Не проще, а правильнее$res=mysql_query('select * from '.TBL_PHOTOS) or die(mysql_error());Незачем запрашивать ВСЮ базу данных, чтобы выбрать из неё три элемента. Код: 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2005, 13:04 |
|
||
|
Выбор случайных фото
|
|||
|---|---|---|---|
|
#18+
*Незачем запрашивать ВСЮ базу данных, чтобы выбрать из неё три элемента. Код: 1. 2. 3. 4. 5. Я понимаю, что нет такого понятий, как "первый элемент БД", "последний элемент БД". Есть просто строка и идентификатор этого поля(не всегда). Если таблица с картинками не обновляется, то запрос будет выбриать одни и те же n-первых фото. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2005, 14:14 |
|
||
|
Выбор случайных фото
|
|||
|---|---|---|---|
|
#18+
А так?) Код: plaintext 1. В этом плане MySQL очень удобен "The CBO without stats is like a morning without coffee." T.Kyte ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2005, 14:41 |
|
||
|
Выбор случайных фото
|
|||
|---|---|---|---|
|
#18+
4m@t!c что бы подсчитать кол-во элементов - перебирается вся база База (а, точнее, таблица) перебирается для подсчёта количества элементов только при отсутствии подходящего индекса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2005, 17:15 |
|
||
|
Выбор случайных фото
|
|||
|---|---|---|---|
|
#18+
hellА так?) Код: plaintext 1. В этом плане MySQL очень удобен "The CBO without stats is like a morning without coffee." T.Kyte Выглядит изячно, но не будет ли такой запрос использовать временную таблицу?... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2005, 17:16 |
|
||
|
Выбор случайных фото
|
|||
|---|---|---|---|
|
#18+
DocAl 4m@t!c что бы подсчитать кол-во элементов - перебирается вся база База (а, точнее, таблица) перебирается для подсчёта количества элементов только при отсутствии подходящего индекса. гы-гы.. да с "базой" - это я конечно лопухнул. А насчет индекса - индекс же должен быть в условии, а если нет условия, то речь же за индекс не идет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2005, 17:28 |
|
||
|
Выбор случайных фото
|
|||
|---|---|---|---|
|
#18+
4m@t!c *Незачем запрашивать ВСЮ базу данных, чтобы выбрать из неё три элемента. Код: 1. 2. Я понимаю, что нет такого понятий, как "первый элемент БД", "последний элемент БД". Есть просто строка и идентификатор этого поля(не всегда). Если таблица с картинками не обновляется, то запрос будет выбриать одни и те же n-первых фото.Да, ошибочка вышла, забыл указать второй параметр после запятой (почему-то решил, что первый параметр - номер записи, а не количество). А по поводу остального добавить нужный ORDER BY, надеюсь, труда не составит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2005, 17:39 |
|
||
|
Выбор случайных фото
|
|||
|---|---|---|---|
|
#18+
По поводу ORDER BY RAND читайте ман. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2005, 17:41 |
|
||
|
Выбор случайных фото
|
|||
|---|---|---|---|
|
#18+
Ман штука хорошая, но именно тут он ничего особо полезного не сказал. Запрос работает, да, делает то, что нужно. Но про то, что такой запрос будет создавать временную таблицу не сказано, а это, увы, факт..( Со всем вытекающими в случае, если таблица большая... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2005, 17:56 |
|
||
|
Выбор случайных фото
|
|||
|---|---|---|---|
|
#18+
Да пёс с ней, с временной таблицейВ выражениях вида ORDER BY не следует использовать столбец с величинами RAND(), поскольку применение оператора ORDER BY приведет к многократным вычислениям в этом столбце. ... Оператор RAND() не следует воспринимать как полноценный генератор случайных чисел...Этого достаточно, чтобы не использовать ORDER BY RAND Ещё помнится бывали глюки на 3.x версии с тем, что выбиралось одно и то же (не каждый раз одно и то же, но довольно часто, да и периуд был небольшим). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2005, 20:16 |
|
||
|
Выбор случайных фото
|
|||
|---|---|---|---|
|
#18+
блинЫ, пришли туда откуда начали :) так что мне делать с этими случайными фото? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2005, 20:35 |
|
||
|
Выбор случайных фото
|
|||
|---|---|---|---|
|
#18+
TigranEблинЫ, пришли туда откуда начали :) так что мне делать с этими случайными фото?Я же всё написал - выбираете COUNT'ом количество записей, потом при помощи PHP генерируете нужное число случайных чисел и достаёте записи в указанных позициях (LIMIT rnd,1) при некотором способе сортировки (ORDER BY id, к примеру). Да, это требует N+1 запрос к базе - если кто-нибудь знает более простой и надёжный способ - было бы интересно услышать (жаль нельзя доставать из базы сразу из нескольких диапазонов, типа LIMIT x,1,y,1,z,1) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2005, 21:53 |
|
||
|
Выбор случайных фото
|
|||
|---|---|---|---|
|
#18+
*Я же всё написал - выбираете COUNT'ом количество записей, потом при помощи PHP генерируете нужное число случайных чисел и достаёте записи в указанных позициях (LIMIT rnd,1) при некотором способе сортировки (ORDER BY id, к примеру). Да, это требует N+1 запрос к базе - если кто-нибудь знает более простой и надёжный способ - было бы интересно услышать (жаль нельзя доставать из базы сразу из нескольких диапазонов, типа LIMIT x,1,y,1,z,1) Так что-ли? Поправьте новичка плиз :) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2005, 22:53 |
|
||
|
Выбор случайных фото
|
|||
|---|---|---|---|
|
#18+
кстати при чем тут "order by"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2005, 22:55 |
|
||
|
Выбор случайных фото
|
|||
|---|---|---|---|
|
#18+
TigranEТак что-ли? Поправьте новичка плиз :)Оно работает? Значит похоже. Оно не работает? PHP FAQ: Ничего не работает! Что делать??? (хотя похоже вы с ним знакомы ;) ) 2 TigranE : PHP FAQ: MySQL. Просто и понятно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2005, 23:01 |
|
||
|
Выбор случайных фото
|
|||
|---|---|---|---|
|
#18+
По темe выбора случайных строк из таблицы MYSQL запросом: Код: plaintext несколько сот тысяч записей запрос будет работать медлено т.к. MySQL будет обрабатывать все записи таблицы, расладывая их в случайном порядке и только после этого выбирая первую запись в полученной очередности. Все это, конечно, требует определенного времени. В случае, если у вас есть хотя бы одно поле типа auto_increment, для создания более быстрого запроса можно поступить следующим образом: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. P.S. Тигран джан, я нечто подобное уже варила для сайта кока-колы, если ничего не выйдет позвони, отмылю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2005, 12:12 |
|
||
|
Выбор случайных фото
|
|||
|---|---|---|---|
|
#18+
*Этого достаточно, чтобы не использовать ORDER BY RAND Ещё помнится бывали глюки на 3.x версии с тем, что выбиралось одно и то же (не каждый раз одно и то же, но довольно часто, да и периуд был небольшим). http://dev.mysql.com/doc/mysql/ru/LIMIT_optimisation.html]про LIMIT Если LIMIT # используется с ORDER BY, MySQL закончит сортировку, как только найдет первые # строк, вместо того, чтобы сортировать всю таблицу. Т.е. по идее для LIMIT 3 строк думаю не очень страшно 3 вызова RAND() :-) Хотя проверить не могу. Насчет временной таблицы - сортировка так или иначе использует временную таблицу(если индекса нет, конечно) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2005, 12:15 |
|
||
|
Выбор случайных фото
|
|||
|---|---|---|---|
|
#18+
hellТ.е. по идее для LIMIT 3 строк думаю не очень страшно 3 вызова RAND() :-)И как вы себе это представляете? Для начала необходимо каждой записи сопоставить случайное число, а у вас же получается взял первые попавшиеся три записи и забыл (это бы ещё ничего, если бы они действительно всегда получались случайными). 2 Армянка , опять же не хватает ORDER BY (хотя не знаю, насколько оно всё же необходимо - спорный вопрос), а из-за привязки к id получается неравномерное распределение (и вообще малопонятно что из-за отсутсвия ORDER BY) - представьте гипотетическую ситуацию - в базе всего две записи, с id = 1 и c id = 1000 - как вы думаете, какая из них в вашем случае будет выпадать чаще? ;) Вот и получается, что те записи, до которых есть большой промежуток, будут "выпадать" чаще, чем те, которые идут подряд. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2005, 12:24 |
|
||
|
Выбор случайных фото
|
|||
|---|---|---|---|
|
#18+
Переписываем с учетом справедливого замечания г-на * :) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2005, 12:54 |
|
||
|
Выбор случайных фото
|
|||
|---|---|---|---|
|
#18+
[quot Армянка]Переписываем с учетом справедливого замечания г-на * :)[/quote]Судя по всему - вы его не поняли. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2005, 13:13 |
|
||
|
Выбор случайных фото
|
|||
|---|---|---|---|
|
#18+
*[quot Армянка]Переписываем с учетом справедливого замечания г-на * :)[/quote]Судя по всему - вы его не поняли. так просветите великодушно :)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2005, 13:24 |
|
||
|
Выбор случайных фото
|
|||
|---|---|---|---|
|
#18+
Армянкатак просветите великодушно :))Просто прочтите ещё раз внимательно - от дыр и неравномерности вы так не избавитесь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2005, 13:29 |
|
||
|
Выбор случайных фото
|
|||
|---|---|---|---|
|
#18+
*Я же всё написал - выбираете COUNT'ом количество записей, потом при помощи PHP генерируете нужное число случайных чисел и достаёте записи в указанных позициях (LIMIT rnd,1) при некотором способе сортировки (ORDER BY id, к примеру). Да, это требует N+1 запрос к базе - если кто-нибудь знает более простой и надёжный способ - было бы интересно услышать (жаль нельзя доставать из базы сразу из нескольких диапазонов, типа LIMIT x,1,y,1,z,1) Согласен, rand() будет выполнятся для всех случаев. Но и в вашем случае будет происходить полное сканирование таблицы/индекса: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2005, 16:18 |
|
||
|
Выбор случайных фото
|
|||
|---|---|---|---|
|
#18+
hellНо и в вашем случае будет происходить полное сканирование таблицы/индекса:А я и не утверждал обратного. Если внимательно вчитаться в ман, то будет понятно, что проблема в том, что функция RAND() - нешустрая. Собственно, возьмите базу поболе и посмотрите по времени, что будет быстрее select id from bugs.mantis_bug_table ORDER BY id LIMIT 5,1 или select id from bugs.mantis_bug_table ORDER BY rand() LIMIT 1 PS: подозреваю, что время выборки будет зависеть от номера записи, т.е. сгенерированного $rnd - попробуйте взять первую запись (LIMIT 0,1) и последнюю (LIMIT $max,1) и усреднить результат - у меня при единичных запросах (без учёта SELECT COUNT(*) FROM bugs.mantis_bug_table - MyAdmin не выдаёт время её выполнения - делать более правильный тест было лень) разница составила ~4 раза. Возможно, при выборе сразу нескольких записей, ситуация изменится (RAND() позволяет это сделать в один запрос). А вообще, попробуйте - из того же phpMyAdmin'а при многократных запросах типа select id from bugs.mantis_bug_table ORDER BY rand() результат мне показался неудовлетворительным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2005, 16:40 |
|
||
|
Выбор случайных фото
|
|||
|---|---|---|---|
|
#18+
В догонку - для RAND'а ещё и Using temporary и Using filesort ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2005, 16:42 |
|
||
|
Выбор случайных фото
|
|||
|---|---|---|---|
|
#18+
Люди, какие несколько сотен тысяч??! таблица у меня совсем крохотная - всего 200 записей в настоящее время, а самое большее ожидается около 1500, да и то не реально:)) В общем, сделал нижеописанным способом и вроде нормально работает... Какие будут замечания? Код: plaintext 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2005, 18:03 |
|
||
|
Выбор случайных фото
|
|||
|---|---|---|---|
|
#18+
group by good_id и distinct одновременно - скорее всего излишество, и выбирай не *, а те поля, которые конкретно нужно иметь "The CBO without stats is like a morning without coffee." T.Kyte ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2005, 18:23 |
|
||
|
Выбор случайных фото
|
|||
|---|---|---|---|
|
#18+
TigranEВ общем, сделал нижеописанным способом и вроде нормально работает...Бред какой-то. Всё, что нужно, уже было написано - умный человек сделает из этого правильные выводы - глупый - пойдёт на поводу чужого мнения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2005, 21:33 |
|
||
|
Выбор случайных фото
|
|||
|---|---|---|---|
|
#18+
* TigranEВ общем, сделал нижеописанным способом и вроде нормально работает...Бред какой-то. Всё, что нужно, уже было написано - умный человек сделает из этого правильные выводы - глупый - пойдёт на поводу чужого мнения. No ved' vse otlichno rabotaet, generator sluchaynyx chisel vpolne ustraivaet, chto kasaetsya skorosti, to protestiroval sistemu s maximal'no vozmojnym chislom zapisej - zaderjka daje ne zametna..... nu pochemu bred? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.01.2005, 15:05 |
|
||
|
Выбор случайных фото
|
|||
|---|---|---|---|
|
#18+
Я чего,то не понимаю? нафиг вам этот лимит? может проще сделать так : $myquery = "select * from ".TBL_PHOTOS." where id = ".rand()." or id = ".rand()." or id=".rand().";" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.01.2005, 17:01 |
|
||
|
Выбор случайных фото
|
|||
|---|---|---|---|
|
#18+
1024byteЯ чего,то не понимаю? нафиг вам этот лимит? может проще сделать так : $myquery = "select * from ".TBL_PHOTOS." where id = ".rand()." or id = ".rand()." or id=".rand().";" ггг ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.01.2005, 17:16 |
|
||
|
Выбор случайных фото
|
|||
|---|---|---|---|
|
#18+
1024byte$myquery = "select * from ".TBL_PHOTOS." where id = ".rand()." or id = ".rand()." or id=".rand().";"Если вы такие умные, что ж вы строем не ходите? (С) народная мудрость. и в результате не получить ниодной записи ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.01.2005, 17:34 |
|
||
|
|

start [/forum/topic.php?all=1&fid=23&tid=1478895]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
152ms |
get topic data: |
6ms |
get forum data: |
1ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
| others: | 226ms |
| total: | 449ms |

| 0 / 0 |
