вопрос по запросам к БД в php

12
C
На сайте с 16.04.2009
Offline
7
1062

Помогите пожалуйста вот с чем, вот код

$res = mysql_query("SELECT blog_ID, blog_name

FROM evo_blogs

where blog_user_rate > 0

LIMIT 9 , 5");

echo '<ul>';

while ($rowa = mysql_fetch_object($res))

{ echo '<li><a href="http://bloodtar.ru/index.php?blog='.$rowa->blog_ID.'" >'.$rowa->blog_name.'</a></li>';}

echo '</ul>';

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

но вышеуказанный код выдает только одни и те же дневники. как сделать чтобы брались рандомно любые 5 дневников?

мир вам и счастье
[Удален]
#1

Вас обманули - он выводит псевдослучайно, причём именно одно и то же )

Если записей в таблице немного, то "limit 9,5" замените на "order by rand() limit 5". Если много записей, то лучше переписать всё.

Много - это несколько тысяч.

C
На сайте с 16.04.2009
Offline
7
#2
nikitian:
Вас обманули - он выводит псевдослучайно, причём именно одно и то же )
Если записей в таблице немного, то "limit 9,5" замените на "order by rand() limit 5". Если много записей, то лучше переписать всё.
Много - это несколько тысяч.

меня не обманывали, код я писал сам:) наверно обьяснил не правильно. я в php полуновичок.

записей около 500, но будет само собой горааздо больше. как же переписать-то?

embo
На сайте с 05.12.2008
Offline
24
#3

не парьтесь, добавьте ORDER BY RAND() в запрос как вам сказали

Плавно двигаемся от сапы к статьям (http://miralinks.ru/users/registration/from:4223)
C
На сайте с 16.04.2009
Offline
7
#4
embo:
не парьтесь, добавьте ORDER BY RAND() в запрос как вам сказали

хотел чтобы все было практично. спасибо, сделаю

[Удален]
#5

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

N
На сайте с 06.05.2007
Offline
419
#6

Практично - пойти на компромисс и использовать к order by rand() дополнительное ограничение. Например, выбирать случайные среди активных за последние 3 месяца.

Остальные способы обхода действительно серьёзной проблемы, связанной с производительностью order by rand(), у вас не окупятся.

Кнопка вызова админа ()
M
На сайте с 23.01.2009
Offline
12
#7

Если записи не удаляются из базы данных, то можно таким подходом воспользоваться


$a = array();
$m = 500; // максимальное количество записей в базе
$i = 0;
while( true )
{
$r = rand( 1, $m );
if( !isset( $a[ $r ] ) )
$a[ $r ] = $i;
else
$i++;

if ( count( $a ) > 4 ) break;
$i++;
}

$a = array_flip( $a );
$sql = 'SELECT blog_ID, blog_name FROM evo_blogs WHERE';
$sql = $sql . ' blog_ID IN ( ' . join( ', ', $a ) . ' )';
написание скриптов... icq 377816882
Dreammaker
На сайте с 20.04.2006
Offline
569
#8

Один из нормальных путей это:

1) получить MIN(id), MAX(id);

2) сгенерировать 50 штук чисел между этими значениями;

3) Сделать или 50 запросов, или сделать id = IN(число, число, число, число ....), или через UNION. Всё это ориентируясь на последовательность полученных в п.2 значений

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

5) Доставать массив разсериализовывать и доставать оттуда случайным образом 5 значений, выводить их.

Моменты на которые стоит обратить внимание:

1) если в п.3 есть ещё какие-то WHERE, то обязательно нужно делать индексы, а лучше составные.

2) мы можем получить не 50, а меньше значений - так как некоторые посты могут быть удалены, в скрипте нужно учитывать это.

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

В целом данный способ испробован и успешно работает, а почему б ему не работать :), на сайте с несколькими десятками тысяч уников (от 30 до 80, в среднем - 40-50К), записей где-то около 5-6 тысяч. Проблемы были только один раз, поэтому я и настаиваю на составных индексах, тогда всплыла проблема как раз с этим.

p.s. общий принцип похож на описанный выше modobaks'ом.

xant
На сайте с 17.12.2008
Offline
65
#9

При нескольких тысячах дневников можно использовать RAND() как параметр LIMIT

Эксклюзивные сайты и веб-2.0 приложения под ключ. Дорого.
Dreammaker
На сайте с 20.04.2006
Offline
569
#10

xant, тут ещё возникает момент, есть ли текстовые поля в таблице, и насколько они заполнены.

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий