Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 20.03.2010, 00:19
Аватар для Jekel
Профессор
Отправить личное сообщение для Jekel Посмотреть профиль Найти все сообщения от Jekel
 
Регистрация: 20.11.2009
Сообщений: 257

rand в php два рендома друг с другом связаны
Как сделать так, чтобы $rnd2 не учитывало $rnd? Тоесть чтобы $rnd никогда не было равно $rnd2.
$kol = mysql_num_rows(mysql_query("SELECT * FROM writers"));

$rnd = rand(1, $kol);

$db1 = mysql_fetch_assoc(mysql_query("SELECT * FROM writers WHERE id='".$rnd."'"));

$rnd2 = rand(1, $kol);

$db2 = mysql_fetch_assoc(mysql_query("SELECT * FROM writers WHERE id='".$rnd2."'"));
Ответить с цитированием
  #2 (permalink)  
Старый 20.03.2010, 00:33
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

да тысяча способов.
while( ($rnd2 = rand(1, $kol)) ==$rnd);
Ответить с цитированием
  #3 (permalink)  
Старый 20.03.2010, 00:53
Аватар для subzey
Пионэр
Отправить личное сообщение для subzey Посмотреть профиль Найти все сообщения от subzey
 
Регистрация: 16.11.2009
Сообщений: 1,322

Гхм… Если Вам нужно две различные случайные строки из таблицы, то так и составляйте запрос:
Код:
SELECT * FROM `writers` ORDER BY RAND() LIMIT 2
UPD: Надеюсь, столбец id хотя бы уникальный?

Последний раз редактировалось subzey, 20.03.2010 в 00:56.
Ответить с цитированием
  #4 (permalink)  
Старый 20.03.2010, 01:23
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

subzey,
вы в своем уме?
сложность вычислений при таком запросе O(N*lg(N))
и все это ради двух строчек.
В то время, как способ Jekel делает это за O(lg(N))
Разницу чуствуете?
PS Вспомнилось
Ответить с цитированием
  #5 (permalink)  
Старый 20.03.2010, 01:45
Аватар для subzey
Пионэр
Отправить личное сообщение для subzey Посмотреть профиль Найти все сообщения от subzey
 
Регистрация: 16.11.2009
Сообщений: 1,322

Gvozd,
вроде, пока да. На стенде, может, это и работает лучше, но как насчет практики?

Авторы никогда не будут удаляться? id всегда-всегда будут идти строго по порядку, а обоспечивать это будут триггеры, или «ручка слива»?

А что, если запись будет всего одна?
while( ($rnd2 = rand(1, 1)) ==$rnd);
Ответить с цитированием
  #6 (permalink)  
Старый 20.03.2010, 02:15
Аватар для Jekel
Профессор
Отправить личное сообщение для Jekel Посмотреть профиль Найти все сообщения от Jekel
 
Регистрация: 20.11.2009
Сообщений: 257

спасибо, while (($rnd2=rand(1, $db1n))==$rnd){} работает)
Ответить с цитированием
  #7 (permalink)  
Старый 20.03.2010, 06:42
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

Сообщение от subzey
Авторы никогда не будут удаляться? id всегда-всегда будут идти строго по порядку, а обоспечивать это будут триггеры, или «ручка слива»?
это просто набор исключительных случаев, которые надо описать в логике PHP-скрипта, в пользу производительности.
Сообщение от subzey
На стенде, может, это и работает лучше, но как насчет практики?
и на практике это решение остается более производительным, чем ваш очень удобный один запрос.
если хотите я могу протестировать насколько именно и опубликовать результаты
Ответить с цитированием
  #8 (permalink)  
Старый 20.03.2010, 09:06
Аватар для B@rmaley.e><e
⊞ Развернуть
Отправить личное сообщение для B@rmaley.e><e Посмотреть профиль Найти все сообщения от B@rmaley.e><e
 
Регистрация: 11.01.2010
Сообщений: 1,810

А зачем три запроса к одной траблице, когда в результате первого запроса уже все есть?

$res = mysql_query("SELECT * FROM writers"); // как ни крути, тяжеллый запрос
$res_length = mysql_num_rows($res);
$entries = array();
$i = 1;
$rnd1 = rand(1, $res_length);
while( ($rnd2 = rand(1, $res_length)) == $rnd1);

while($row = mysql_fetch_assoc($res)){
   if($i == $rnd1) $entries[0] = $row;
   if($i == $rnd2) $entries[1] = $row;
   $i++;
   if(count($entries) == 2) break;
}

Последний раз редактировалось B@rmaley.e><e, 20.03.2010 в 09:13.
Ответить с цитированием
  #9 (permalink)  
Старый 20.03.2010, 11:14
Аватар для subzey
Пионэр
Отправить личное сообщение для subzey Посмотреть профиль Найти все сообщения от subzey
 
Регистрация: 16.11.2009
Сообщений: 1,322

Сообщение от Gvozd
надо описать в логике PHP-скрипта, в пользу производительности.
Вот… это меня и смущает; по-моему, это задача для уровня БД, а не приложения. (Но, возможно, меня просто развратил PostgreSQL).

B@rmaley.e><e,
купить торт и съесть только вишенку. Тоже вариант, только, наверное, вместо while по mysql_fetch_assoc() — mysql_data_seek().
Ответить с цитированием
  #10 (permalink)  
Старый 21.03.2010, 00:40
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

Сообщение от subzey
это задача для уровня БД
по логике-да
к сожалению, все известные мне решения на чистом MySQL весьма и весьма непродуктивны.
например ваше решение, как раз и есть то, за что вы осуждаете других
Сообщение от subzey
купить торт и съесть только вишенку
вычислить для каждой строки таблицы случайную величину, отсортировать эту кучу случайных чисел а затем взять только строку, или две.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск