Forum Webscript.Ru

Программирование => PHP => Тема начата: tosha_rus от 15 Августа 2002, 03:16:17

Название: случайность + постраничный вывод
Отправлено: tosha_rus от 15 Августа 2002, 03:16:17
Такая проблемка:
Есть mysql база с парой сотен строк.
Необходимо сделать постраничное отображение этих данных с совершенно случайной сортировкой, но чтобы на разных страницах результаты не повторялись.
Пробовал просто SELECT * FROM table_name ORDER BY RAND() LIMIT , но от страницы к странице есть повторы.
Надеюсь на помощь!
Название: Алгоритмический вариант :-)
Отправлено: Дмитрий Попов от 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());

Название: случайность + постраничный вывод
Отправлено: Доктор от 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 от 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");
?>


Зарание спасибо за вашу помощь
Название: случайность + постраничный вывод
Отправлено: Доктор от 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";
Название: случайность + постраничный вывод
Отправлено: Меняздесьдавнонет от 17 Августа 2002, 09:37:59
Ну, сортировка по столбцам имеет очень ограниченное количество вариантов...
То, что предложил Дмитрий Попов, породит совершенно невообразимые запросы.

Скорее уж считывать все в скрипт, order by rand, без лимита,  а выводить справляясь с массивом уже выданных строк, и попутно в него записывая.
Не очень много кода, но нужны сессии.
Название: случайность + постраничный вывод
Отправлено: tosha_rus от 18 Августа 2002, 03:01:46
Какое кол-во вариантов можно получить таким способом при 100-200 записях в базе данных и какова их зависимость от параметра  $num_rows=5.
Сколько нужно поставить, чтоб получить наиболее большее кол-во случайных вариантов?
Название: случайность + постраничный вывод
Отправлено: Доктор от 18 Августа 2002, 05:07:13
Я неправильно назвал... надо было не $num_rows, а $num_cols - количество столбцов в твоей таблице.  Вариантов при этом раскладе всего $num_cols*2 (но можно же сделать и сортировку по 2-м, 3-м, 4-м случайным столбцам).
Вообще же, если ты учил математику, то при 100 записях существует 100! (факториал) различных возможных порядков. Это ну ОЧЕНЬ большое число.
Название: случайность + постраничный вывод
Отправлено: Меняздесьдавнонет от 18 Августа 2002, 12:48:52
Доктор, сортировка по двум и более столбцам вряд ли даст какой-то эффект. У него же нет повторяющихся значений.

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


Спасибо за подсказку, но я все равно не понял. К сожалению для меня программирование темный лес,
Название: случайность + постраничный вывод
Отправлено: Меняздесьдавнонет от 18 Августа 2002, 16:22:08
tosha_rus
Читать надо внимательнее, что тебе Доктор пишет :-)
Для этого программирование знать совсем не обязательно.
Вообще-то Доктор не 100 написал ;-)

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

Да и вообще - оставь, как есть. я понимаю, вопросы брались бы всегда разные. А просто перемешать - не больно-то и надо.
Я так понял, что скрипт этот не ты писал? Ну и оставь, как есть.
Название: случайность + постраничный вывод
Отправлено: tosha_rus от 19 Августа 2002, 02:48:03
Я просил скриптик поправить, ЧИТАТЬ НАДО ВНИМАТЕЛЬНЕЕ (4 пост).

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

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

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

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