Автор Тема: случайность + постраничный вывод  (Прочитано 4063 раз)

0 Пользователей и 1 Гость просматривают эту тему.

tosha_rus

  • Гость
случайность + постраничный вывод
« : 15 Августа 2002, 03:16:17 »
Такая проблемка:
Есть mysql база с парой сотен строк.
Необходимо сделать постраничное отображение этих данных с совершенно случайной сортировкой, но чтобы на разных страницах результаты не повторялись.
Пробовал просто SELECT * FROM table_name ORDER BY RAND() LIMIT , но от страницы к странице есть повторы.
Надеюсь на помощь!

Оффлайн Дмитрий Попов

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 264
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.programmist.spb.ru
Алгоритмический вариант :-)
« Ответ #1 : 15 Августа 2002, 03:36:13 »
Может быть (ИМХО) можно сделать так:

стартуем сессию, а после запроса регистрируем в ней в массиве те строки, которые она вывела.

На следующей странице данные сессии передаются и пишете что-то вроде этого ($randoms[] - массив с результатами предыдущих выборок, id - уникальное поле для каждой строки в базе):


$query
="SELECT * FROM table_name ORDER BY RAND() LIMIT where";

$i=0;
while(
$i!=count($randoms)){

$query.=" id<>$randoms[$i]";

$i++;
}

$result=mysql_query($query) or die(mysql_error());

 За Родину! За Россию!
SendMail для любого хостинга.

Оффлайн Доктор

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 487
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
случайность + постраничный вывод
« Ответ #2 : 15 Августа 2002, 16:14:35 »
Надо простов скрипте а не в запросе определять по какому столбцубудетидти сортировка, случайно для каждого юзера. И ему в сессию это записывать.
И запрос:
$query =  "SELECT * FROM table_name ORDER BY $column_for_current_user LIMIT ".(($page-1)*$rows_per_page).", $rows_per_page";

tosha_rus

  • Гость
случайность + постраничный вывод
« Ответ #3 : 16 Августа 2002, 03:38:31 »
Чуствую из-за моих малых познаний в программирований не исправить самому.
Ниже представил исходный кусок кода
Помогите плиз встроить случайность сортировки данных.



$catid=$HTTP_GET_VARS[\'catid\'];

if (empty($catid))
   {
      $catid=0;
   }
else
   {
      $catid=intval($catid);
   }

if (empty($start))
    {   
       $start=0;
   }
else
   {
      $start=intval($start);
   }


require("./config/config.php");
require("./config/functions.php");
require("./config/settings.php");

$base = mysql_connect($dbhost,$dbuser,$dbpassword);
mysql_select_db($dbname,$base);

$query="SELECT * FROM table WHERE catid=$catid and  isChecked > 1  ORDER BY date DESC LIMIT $start,$rows_per_page";
$result=mysql_query($query,$base) or die(mysql_error());


include("./template/header.php");
if (mysql_num_rows($result) == 0)
   {
      echo "
В этом разделе данные отсутствуют
";
   }
else
   {
          echo "
$sections[$catid]


";
       include("./template/list.php");
       while($myrow=mysql_fetch_array($result)):
           extract($myrow);
          // выводим содержимое таблицы
         include("./inc/print_row.php");
       endwhile;
       include("./template/close_list.php");
          echo "
";
       // выводим навигацию
       $query="SELECT count(*) FROM $Meet_Account WHERE catid=$catid and isChecked > 1";
       $result=mysql_query($query,$base) or die (mysql_error());
       $myrow=mysql_fetch_row($result);
       print_navigation($start,$myrow[0],$rows_per_page,"&catid=".$catid);
         echo "
";
   }
include("./template/footer.php");
?>


Зарание спасибо за вашу помощь

Оффлайн Доктор

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 487
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
случайность + постраничный вывод
« Ответ #4 : 16 Августа 2002, 16:50:56 »
Тут:


$num_rows
=5// число столбцов в таблице

session_start();

if (
$order=="") {
  
srand((double)microtime()*1000000);
  
$order=rand(1,$num_rows).(rand(0,1) ? "" " desc");
  
session_register("order");
  }

$query="SELECT * FROM table WHERE catid=$catid and isChecked > 1 ORDER BY $order LIMIT $start,$rows_per_page";

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
случайность + постраничный вывод
« Ответ #5 : 17 Августа 2002, 09:37:59 »
Ну, сортировка по столбцам имеет очень ограниченное количество вариантов...
То, что предложил Дмитрий Попов, породит совершенно невообразимые запросы.

Скорее уж считывать все в скрипт, order by rand, без лимита,  а выводить справляясь с массивом уже выданных строк, и попутно в него записывая.
Не очень много кода, но нужны сессии.
« Последнее редактирование: 17 Августа 2002, 09:46:44 от RomikChef »

tosha_rus

  • Гость
случайность + постраничный вывод
« Ответ #6 : 18 Августа 2002, 03:01:46 »
Какое кол-во вариантов можно получить таким способом при 100-200 записях в базе данных и какова их зависимость от параметра  $num_rows=5.
Сколько нужно поставить, чтоб получить наиболее большее кол-во случайных вариантов?

Оффлайн Доктор

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 487
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
случайность + постраничный вывод
« Ответ #7 : 18 Августа 2002, 05:07:13 »
Я неправильно назвал... надо было не $num_rows, а $num_cols - количество столбцов в твоей таблице.  Вариантов при этом раскладе всего $num_cols*2 (но можно же сделать и сортировку по 2-м, 3-м, 4-м случайным столбцам).
Вообще же, если ты учил математику, то при 100 записях существует 100! (факториал) различных возможных порядков. Это ну ОЧЕНЬ большое число.

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
случайность + постраничный вывод
« Ответ #8 : 18 Августа 2002, 12:48:52 »
Доктор, сортировка по двум и более столбцам вряд ли даст какой-то эффект. У него же нет повторяющихся значений.

tosha_rus
Ты кого спрашивал-то?
Если меня, то много. И от количества выводимых столбцов никак не зависит.
Кстати, если будешь делать массив уже выведенных, то номер выведенного вопроса пиши не в значение, а в индекс.
$arr[$id]=1;
Тогда проверять можно без циклов.
if (!$arr[$id]) {
  echo $vopros;
  $arr[$id]=1;
}
пример работы с сессиями смотри тут http://php.spb.ru

tosha_rus

  • Гость
случайность + постраничный вывод
« Ответ #9 : 18 Августа 2002, 15:58:31 »
Спасибо Доктор за помощь, хоть и не такая как хотелось но случайность присутствует в таком варианте.


Цитировать
Вообще же, если ты учил математику, то при 100 записях существует 100! (факториал) различных возможных порядков. Это ну ОЧЕНЬ большое число.



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




Цитировать
tosha_rus
Ты кого спрашивал-то?
Если меня, то много. И от количества выводимых столбцов никак не зависит.
Кстати, если будешь делать массив уже выведенных, то номер выведенного вопроса пиши не в значение, а в индекс.
$arr[$id]=1;
Тогда проверять можно без циклов.
if (!$arr[$id]) {
echo $vopros;
$arr[$id]=1;
}
пример работы с сессиями смотри тут http://php.spb.ru


Спасибо за подсказку, но я все равно не понял. К сожалению для меня программирование темный лес,

Оффлайн Меняздесьдавнонет

  • новичЕк
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 5698
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
случайность + постраничный вывод
« Ответ #10 : 18 Августа 2002, 16:22:08 »
tosha_rus
Читать надо внимательнее, что тебе Доктор пишет :-)
Для этого программирование знать совсем не обязательно.
Вообще-то Доктор не 100 написал ;-)

Ну а раз ты не программист, то зачем вообще пришел на форум-то? Если ты не можешь использовать ответ, то зачем спрашивать?

Да и вообще - оставь, как есть. я понимаю, вопросы брались бы всегда разные. А просто перемешать - не больно-то и надо.
Я так понял, что скрипт этот не ты писал? Ну и оставь, как есть.

tosha_rus

  • Гость
случайность + постраничный вывод
« Ответ #11 : 19 Августа 2002, 02:48:03 »
Я просил скриптик поправить, ЧИТАТЬ НАДО ВНИМАТЕЛЬНЕЕ (4 пост).

Зачем пришел зачем пришел, тебя не спросил зачем мне приходить.

И что за привычка чуть что так на человека наезжать и язвить по поводу и без повода, видимо специфика накладывает свои отпечатки :)))))

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

Тут уж мне решать оставить скрипт как есть или исправлять его.

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28