Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вывод рандомных столбцов из MySQL 
:(
    Опции темы
Sice
  Дата 23.12.2008, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Радио Онлайн
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 4.12.2007

Репутация: 0
Всего: 0



Помогите пожалуйста, нужно вывести 20 рандомных записей из БД (MySQL) и занести их в массив.
Не понимаю как осуществить, подскажите пожалуйста, заранее спасибо.
PM MAIL WWW   Вверх
MoLeX
Дата 23.12.2008, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: 46
Всего: 140



что то наподобие
Код

SELECT * FROM `table`ORDER BY RAND( ) LIMIT 0 , 20



--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
skyboy
Дата 23.12.2008, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Цитата

Вывод рандомных столбцов

Цитата(Sice @  23.12.2008,  13:30 Найти цитируемый пост)
нужно вывести 20 рандомных записей

надо определиться. то ли тебе случайные поля одной записи(дикая денормализация?), либо тебе 20 записей.
PM MAIL   Вверх
Sice
Дата 23.12.2008, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Радио Онлайн
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 4.12.2007

Репутация: 0
Всего: 0



Цитата(skyboy @ 23.12.2008,  14:39)
Цитата

Вывод рандомных столбцов

Цитата(Sice @  23.12.2008,  13:30 Найти цитируемый пост)
нужно вывести 20 рандомных записей

надо определиться. то ли тебе случайные поля одной записи(дикая денормализация?), либо тебе 20 записей.

извиняюсь, 20 столбцов нужно вывести, спасибо MoLex, тогда получается

Код

$result = mysql_query("SELECT * FROM `table`ORDER BY RAND( ) LIMIT 0 , 20");
$rows = mysql_fetch_array($result);


Получается, что в $result занесся только первый столбик, а вопрос в том, как 'положить' остальные 19 столбиков в массив или просто в переменные?

p.s я только учусь  smile 

Это сообщение отредактировал(а) Sice - 23.12.2008, 14:46
PM MAIL WWW   Вверх
bars80080
Дата 23.12.2008, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



в $result занёсся индификатор выборки, а в $row ты получил первую строку выборки, разбиваемую в массив по полям
чтобы получить все 20, достаточно прокрутить $rows = mysql_fetch_array($result); в цикле. всякий раз в $row будет новая строка


"20 столбцов нужно вывести" - не соответствует тому что предложил Molex
PM MAIL WWW   Вверх
Sice
Дата 23.12.2008, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Радио Онлайн
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 4.12.2007

Репутация: 0
Всего: 0



Цитата(bars80080 @ 23.12.2008,  15:16)
в $result занёсся индификатор выборки, а в $row ты получил первую строку выборки, разбиваемую в массив по полям
чтобы получить все 20, достаточно прокрутить $rows = mysql_fetch_array($result); в цикле. всякий раз в $row будет новая строка


"20 столбцов нужно вывести" - не соответствует тому что предложил Molex

я просто путаю столбцы с полями )))) 

bars, вот смотри, через цикл прогоняем например так:

Код

<?
do
{
//
}
while (mysql_fetch_array($rows));
?>


Как я понял так? А теперь как мне присвоить к каждому полю переменную ?? Не писать же мне еще19 раз этот цикл ? smile

Добавлено @ 17:58


Это сообщение отредактировал(а) Sice - 23.12.2008, 18:00
PM MAIL WWW   Вверх
bars80080
Дата 23.12.2008, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



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

скажем, так:

Код

$sql = 'SELECT * FROM `table`ORDER BY RAND( ) LIMIT 0 , 20';
$result = mysql_query($sql);
$i = 0;
while($row = mysql_fetch_array($result)) {
    echo 'строчка '.$i.': колонка1='.$row['column1'].', колонка2='.$row['column2']; // и т.д.
    $i++;
}


конечно надо заменить column1 и т.д. на имена твоих полей
PM MAIL WWW   Вверх
gibbzy
Дата 24.12.2008, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 25.1.2008

Репутация: нет
Всего: 3



а если не секрет для чего это ? 
PM MAIL WWW ICQ   Вверх
bars80080
Дата 24.12.2008, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



наверно, для того чтобы решить задачу топикстартера
PM MAIL WWW   Вверх
skyboy
Дата 24.12.2008, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



gibbzy, ну, типа "20 случайных фото" или "20 произвольных продуктов в категории"
PM MAIL   Вверх
gibbzy
Дата 24.12.2008, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 25.1.2008

Репутация: нет
Всего: 3



skyboy, можно ещё взять максимальное id и методами php сгенерить случайное число в этом диапазоне. А потом выбрать. 
Я картинки обычно называю id шниками тут и выбирать не нужно 
PM MAIL WWW ICQ   Вверх
theworldcreator
Дата 24.12.2008, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 362
Регистрация: 25.8.2007
Где: Москва

Репутация: 10
Всего: 13



gibbzy
Гениально. Вместо использования одного быстрого и рабочего mysql запроса, воспользуемся двумя, инициализируем лишний раз генератор случайных чисел, так еще и лишимся стабильности. Браво.
PM MAIL WWW ICQ   Вверх
bars80080
Дата 24.12.2008, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



при этом не учитывая, что наличие id=100, не говорит о наличии ста записей
PM MAIL WWW   Вверх
Nigel
Дата 24.12.2008, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


познаю мир
**


Профиль
Группа: Участник
Сообщений: 515
Регистрация: 20.11.2007

Репутация: 7
Всего: 19



Цитата(theworldcreator @ 24.12.2008,  18:12)
gibbzy
Гениально. Вместо использования одного быстрого и рабочего mysql запроса, воспользуемся двумя, инициализируем лишний раз генератор случайных чисел, так еще и лишимся стабильности. Браво.

Это какой быстрый и рабочий запрос? 
Код

select * from `table` order by rand()

Этот чтоли? Это самый тормознутый из всех запросов мускула smile 
PM MAIL   Вверх
godvinn
Дата 24.12.2008, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 407
Регистрация: 4.4.2008
Где: possibility of mo ving to Kyiv

Репутация: 1
Всего: 1



Nigel а можешь предложить альтернативу этому запросу, чтобы явно подходила под эту задачу*?


--------------------
Everything happens in life.
user posted image
PM MAIL   Вверх
Nigel
Дата 24.12.2008, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


познаю мир
**


Профиль
Группа: Участник
Сообщений: 515
Регистрация: 20.11.2007

Репутация: 7
Всего: 19



Что-то типа такого
Код

select * from `table` where id>(select floor(max(id)*rand()) from `table`) limit 10;

Конечно, нужен ключ по полю id.
PM MAIL   Вверх
bars80080
Дата 24.12.2008, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



меня тут осенила гениальнейшая идея на ноб.премию

смотрю, как тут не первый раз возникают темы про случайную выборку и про то, насколько она тормознутая средствами mysql и подумалось следующее

как бы мы там ни говорили про идеальность, всё равно её не существует, если мы говорим о "случайном" выборе, то на самом деле подразумеваем псевдослучайную последовательность, которая периодически повторяется, но с большим периодом. в конце концов в электронике нет генератора чистой случайности за исключением болометра

итак, вместо того чтобы пользоваться rand можно сконструировать псевдослучайный режим выборки, скажем, так:
условия: при всём уважении, если мы поднимаем что-то, к примеру случайные фотографии или набор новостей, то больше 20-40 смысла нет
отсюда, можно ввести в таблицу поле rnd int в которое при запросах insert и update будет вноситься случайное число. далее, при необходимости случайной выборки мы средствами пхп случайно определяем два-три числовых параметра. допустим: дата, число rnd int и в какую сторону считать выше или ниже. после этого строим запрос по принципу: 

... where date<$rnd_date and rnd>$rnd_int order by rnd desc limit 20

синим и красным отмечены случайные элементы. если элементов не хватает, то надо просто отсчитать в другую сторону, костыль придумать не сложно

в зависимости от количества присутствующих в таблице данных и количества подобных запросов в единицу времени мы получаем примерную периодичность повторения этой псевдослучайной последовательности. имхо, это будет настолько редко, что никто и не заметит, тем более что внесение одной дополнительной записи разрушает период и полное совпадение возможно только случайно




вот такое вот идея  smile 
PM MAIL WWW   Вверх
skyboy
Дата 24.12.2008, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Nigel, однако в вырожденном случае(rand() вернуло 1) мы получим выборку из одной записи. сколько бы ни было в таблице. естественно, в реальности все может быть, но поначалу(пока в таблице данных немного) такая накладка вполне может частенько происходить: нужное количество есть, но выводятся не все.
PM MAIL   Вверх
Nigel
Дата 24.12.2008, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


познаю мир
**


Профиль
Группа: Участник
Сообщений: 515
Регистрация: 20.11.2007

Репутация: 7
Всего: 19



skyboy, http://dev.mysql.com/doc/refman/5.1/en/mat...l#function_rand в неравенстве строго меньше 1.
PM MAIL   Вверх
skyboy
Дата 25.12.2008, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Nigel, окей. 9 записей всего. надо выбрать максимум 10 случайных. rand() возвращает 0,5. сколько записей из списка id (1,2,3,4,5,6,7,8,9) будет возвращено? готов поспорить, что 5(id: 5,6,7,8,9). Это не то, что десять требуемых, а даже не девять имеющихся. 
итак, продолжим измышления.
пускай, у нас значения id распределены так:
1,2,3,4,5,6,7,8,9,100
вероятность того, что floor(rand() * 100) будет больше 9 высока - 9/10. То есть вероятность 90%, что вместо хотя бы 9 значений будет получено только одно.
или я что-то неверно понимаю?

Добавлено через 2 минуты и 51 секунду
нет, вариантов вижу два: выбрать id в клиента и средствами клиента перемешать/выбрать N требуемых или же "тот самый неэффективный запрос с order by rand()". впорчем, не все так плохо: можно поле "случайное значение для сортировки" записывать в таблицу и обновлять...эээ..ну, раз в час. тогда и индексы используются, и элементы местами меняются, да и клиенты вполне могут не заметить.
PM MAIL   Вверх
Nigel
Дата 25.12.2008, 02:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


познаю мир
**


Профиль
Группа: Участник
Сообщений: 515
Регистрация: 20.11.2007

Репутация: 7
Всего: 19



Выбрать 10 записей из 9 возможных? Это как? Опечатка, видимо smile 

skyboy, order by rand() начинает тормозить на 4-5 тыс записях, поэтому приводить в пример таблицу с 5-ю, 10-ю или 20-ю записями не коректно. Примерно из той же оперы: у меня таблица с 3-мя записями, при выборке мускул подлец индексы не использует, щас я ему форс пропишу, чтоб было как надо. 
Цитата(skyboy @  25.12.2008, 00:37)

можно поле "случайное значение для сортировки" записывать в таблицу и обновлять

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

Это сообщение отредактировал(а) Nigel - 25.12.2008, 02:52
PM MAIL   Вверх
skyboy
Дата 25.12.2008, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Nigel, сложно возразить. 
Да, приведенный тобой запрос быстрее.
Да, таблица с пятью записями маловероятно появится в реальном проекте. 
Но, с другой стороны:
- если имеется значительная "дырка" в значениях поля id(массовая чистка контента портала, удаление тестовых данных), то данные, с идентификатором "до дырки" будут выбираться значительно реже тех, что "после дырки"
- данные будут идти подряд(в смысле, выбираются идентификаторы, идущие подряд) - разве это больший "рэндом", чем обновление каждый час?
впрочем, да. согласен. в реальном проекте разработчика должна волновать производительность запроса на 5 тысячах записей, нежели корректность работы.
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0701 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.