[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Произвольная выборка из таблицы
Slip
Здравствуйте.

Подскажите пожалуйста, как можно реализовать условие хаотичного выбора массивов из таблицы. Т.е. чтоб по id не по порядку выводились - 1, 2, 3, 4 а к примеру вот так 3, 1, 4, 2. Массивов более 1000.
И второе условие, чтобы этот порядок всегда сохранялся один и тот же при обращении к странице.



Спустя 1 час, 24 секунды (5.06.2010 - 07:52) Игорь_Vasinsky написал(а):
интересно..сначало те нужна хаотичность... потом порядок..

в mysql есть функции для случайной выборки данных..

но я предложу:

rand (1,x)

, где x - максимально возможный id (либо ты его сразу знаешь, либо считаешь все строки в таблице и вставляешь)

создаёшь переменную с помощью rand ():

$rand_variable = rand (1, 200);


для создания таблице используй это в цикле (при запросе к базе - огранич выводимое число строк)...

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

это я конечн перемудрил..но у мя бы заработало...

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

Спустя 2 часа, 31 минута, 31 секунда (5.06.2010 - 10:23) twin написал(а):
Самый простой способ
SELECT * FROM table ORDER BY RAND() LINIT 10

но если таблица достаточно большая и посещаемость тоже, будет подтормаживать.

Игорь_Vasinsky
Почитай тут, не нужно с циклов начинать. Если делать на стороне пыхи, то так:

$rand_variable = rand (1, 200);
mysql_query("SELECT * FROM table WHERE `id` IN (". implode(',', $rand_variable) .")");


Но это тоже не совсем верно, ибо могут быть пропуски.

Спустя 3 минуты, 20 секунд (5.06.2010 - 10:26) Игорь_Vasinsky написал(а):
Цитата
SELECT * FROM table ORDER BY RAND() LINIT 10


не спорю.

но эт тока половина ответа.. емуж надо сохранить этот 'случайный порядок' - чтоб при след заходе он повторился... blink.gif

Спустя 17 минут, 5 секунд (5.06.2010 - 10:44) Basili4 написал(а):
Проверять например на наличие куки у пльзователя если она есть читать её содержимое в нем хранить циферку большую которая означает имя файла в котором указан порядок отображения и понему отображать. Если нет то генерировать случайные цифери писать в фал давать ему имя циферное имя писать в куку кук сбрасыать пользователю. Я смутоно представляю как наиболее быстро и без циклов отображать значения из базы. Я вижу только цикл и внутри запрос. Нет точно можно собрать всю строку и сделать так where id in массив циферек

Спустя 28 минут, 56 секунд (5.06.2010 - 11:12) Slip написал(а):
Для меня все это слишком, так как мои знания великого и могучего крайне не велики smile.gif

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

Сделаю так: возьму генератор случайных чисел
mt_srand(time()+(double)microtime()*1000000);
for($i=0;$i<10;$i++) { $d=mt_rand(1,1000000);};
echo "$d";

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

Хаос и порядок в одном флаконе smile.gif

Всем спасибо!

Спустя 2 часа, 20 минут, 31 секунда (5.06.2010 - 13:33) FatCat написал(а):
Цитата (twin @ 5.06.2010 - 11:23)
ибо могут быть пропуски

Решается в 2 запроса, оба не нагрузочные.
mysql_query("SELECT id FROM table WHERE id>0");

В цикле заполняем массив имеющихся айдишников:
$idz[] = $row['id'];

Теперь можно собирать рандомные айдишники по номерам массива:
$ridz = array();
while( count($ridz)<=5 ) // Если нужно 5 случайных
{
$d = rand (0, (count($idz)-1) );
$ridz[$d] = $idz[$d];
}
$ridz = implode(",",$ridz);

Теперь вторым запросом забрать рандомные строки:
mysql_query("SELECT * FROM table WHERE id IN(".$ridz.")");
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.