Forum Webscript.Ru
Программирование => PHP => Тема начата: tosha_rus от 15 Августа 2002, 03:16:17
-
Такая проблемка:
Есть mysql база с парой сотен строк.
Необходимо сделать постраничное отображение этих данных с совершенно случайной сортировкой, но чтобы на разных страницах результаты не повторялись.
Пробовал просто SELECT * FROM table_name ORDER BY RAND() LIMIT , но от страницы к странице есть повторы.
Надеюсь на помощь!
-
Может быть (ИМХО) можно сделать так:
стартуем сессию, а после запроса регистрируем в ней в массиве те строки, которые она вывела.
На следующей странице данные сессии передаются и пишете что-то вроде этого ($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());
-
Надо простов скрипте а не в запросе определять по какому столбцубудетидти сортировка, случайно для каждого юзера. И ему в сессию это записывать.
И запрос:
$query = "SELECT * FROM table_name ORDER BY $column_for_current_user LIMIT ".(($page-1)*$rows_per_page).", $rows_per_page";
-
Чуствую из-за моих малых познаний в программирований не исправить самому.
Ниже представил исходный кусок кода
Помогите плиз встроить случайность сортировки данных.
$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");
?>
Зарание спасибо за вашу помощь
-
Тут:
$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";
-
Ну, сортировка по столбцам имеет очень ограниченное количество вариантов...
То, что предложил Дмитрий Попов, породит совершенно невообразимые запросы.
Скорее уж считывать все в скрипт, order by rand, без лимита, а выводить справляясь с массивом уже выданных строк, и попутно в него записывая.
Не очень много кода, но нужны сессии.
-
Какое кол-во вариантов можно получить таким способом при 100-200 записях в базе данных и какова их зависимость от параметра $num_rows=5.
Сколько нужно поставить, чтоб получить наиболее большее кол-во случайных вариантов?
-
Я неправильно назвал... надо было не $num_rows, а $num_cols - количество столбцов в твоей таблице. Вариантов при этом раскладе всего $num_cols*2 (но можно же сделать и сортировку по 2-м, 3-м, 4-м случайным столбцам).
Вообще же, если ты учил математику, то при 100 записях существует 100! (факториал) различных возможных порядков. Это ну ОЧЕНЬ большое число.
-
Доктор, сортировка по двум и более столбцам вряд ли даст какой-то эффект. У него же нет повторяющихся значений.
tosha_rus
Ты кого спрашивал-то?
Если меня, то много. И от количества выводимых столбцов никак не зависит.
Кстати, если будешь делать массив уже выведенных, то номер выведенного вопроса пиши не в значение, а в индекс.
$arr[$id]=1;
Тогда проверять можно без циклов.
if (!$arr[$id]) {
echo $vopros;
$arr[$id]=1;
}
пример работы с сессиями смотри тут http://php.spb.ru
-
Спасибо Доктор за помощь, хоть и не такая как хотелось но случайность присутствует в таком варианте.
Вообще же, если ты учил математику, то при 100 записях существует 100! (факториал) различных возможных порядков. Это ну ОЧЕНЬ большое число.
Может я чего недопонимаю, но из 100 записей можно сложить гораздо гораздо больше случайных вариантов чем сто.
tosha_rus
Ты кого спрашивал-то?
Если меня, то много. И от количества выводимых столбцов никак не зависит.
Кстати, если будешь делать массив уже выведенных, то номер выведенного вопроса пиши не в значение, а в индекс.
$arr[$id]=1;
Тогда проверять можно без циклов.
if (!$arr[$id]) {
echo $vopros;
$arr[$id]=1;
}
пример работы с сессиями смотри тут http://php.spb.ru
Спасибо за подсказку, но я все равно не понял. К сожалению для меня программирование темный лес,
-
tosha_rus
Читать надо внимательнее, что тебе Доктор пишет :-)
Для этого программирование знать совсем не обязательно.
Вообще-то Доктор не 100 написал ;-)
Ну а раз ты не программист, то зачем вообще пришел на форум-то? Если ты не можешь использовать ответ, то зачем спрашивать?
Да и вообще - оставь, как есть. я понимаю, вопросы брались бы всегда разные. А просто перемешать - не больно-то и надо.
Я так понял, что скрипт этот не ты писал? Ну и оставь, как есть.
-
Я просил скриптик поправить, ЧИТАТЬ НАДО ВНИМАТЕЛЬНЕЕ (4 пост).
Зачем пришел зачем пришел, тебя не спросил зачем мне приходить.
И что за привычка чуть что так на человека наезжать и язвить по поводу и без повода, видимо специфика накладывает свои отпечатки :)))))
Если уж нет желания помогать людям, то и не лез бы в это дело, не стоит показывать какой ты крутой спец.
Тут уж мне решать оставить скрипт как есть или исправлять его.