20.03.2010, 00:19
|
|
Профессор
|
|
Регистрация: 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."'"));
|
|
20.03.2010, 00:33
|
|
Матрос
|
|
Регистрация: 04.04.2008
Сообщений: 6,246
|
|
да тысяча способов.
while( ($rnd2 = rand(1, $kol)) ==$rnd);
|
|
20.03.2010, 00:53
|
|
Пионэр
|
|
Регистрация: 16.11.2009
Сообщений: 1,322
|
|
Гхм… Если Вам нужно две различные случайные строки из таблицы, то так и составляйте запрос:
Код:
|
SELECT * FROM `writers` ORDER BY RAND() LIMIT 2 |
UPD: Надеюсь, столбец id хотя бы уникальный?
Последний раз редактировалось subzey, 20.03.2010 в 00:56.
|
|
20.03.2010, 01:23
|
|
Матрос
|
|
Регистрация: 04.04.2008
Сообщений: 6,246
|
|
subzey,
вы в своем уме?
сложность вычислений при таком запросе O(N*lg(N))
и все это ради двух строчек.
В то время, как способ Jekel делает это за O(lg(N))
Разницу чуствуете?
PS Вспомнилось
|
|
20.03.2010, 01:45
|
|
Пионэр
|
|
Регистрация: 16.11.2009
Сообщений: 1,322
|
|
Gvozd,
вроде, пока да. На стенде, может, это и работает лучше, но как насчет практики?
Авторы никогда не будут удаляться? id всегда-всегда будут идти строго по порядку, а обоспечивать это будут триггеры, или «ручка слива»?
А что, если запись будет всего одна?
while( ($rnd2 = rand(1, 1)) ==$rnd);
|
|
20.03.2010, 02:15
|
|
Профессор
|
|
Регистрация: 20.11.2009
Сообщений: 257
|
|
спасибо, while (($rnd2=rand(1, $db1n))==$rnd){} работает)
|
|
20.03.2010, 06:42
|
|
Матрос
|
|
Регистрация: 04.04.2008
Сообщений: 6,246
|
|
Сообщение от subzey
|
Авторы никогда не будут удаляться? id всегда-всегда будут идти строго по порядку, а обоспечивать это будут триггеры, или «ручка слива»?
|
это просто набор исключительных случаев, которые надо описать в логике PHP-скрипта, в пользу производительности.
Сообщение от subzey
|
На стенде, может, это и работает лучше, но как насчет практики?
|
и на практике это решение остается более производительным, чем ваш очень удобный один запрос.
если хотите я могу протестировать насколько именно и опубликовать результаты
|
|
20.03.2010, 09:06
|
|
⊞ Развернуть
|
|
Регистрация: 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.
|
|
20.03.2010, 11:14
|
|
Пионэр
|
|
Регистрация: 16.11.2009
Сообщений: 1,322
|
|
Сообщение от Gvozd
|
надо описать в логике PHP-скрипта, в пользу производительности.
|
Вот… это меня и смущает; по-моему, это задача для уровня БД, а не приложения. (Но, возможно, меня просто развратил PostgreSQL).
B@rmaley.e><e,
купить торт и съесть только вишенку. Тоже вариант, только, наверное, вместо while по mysql_fetch_assoc() — mysql_data_seek().
|
|
21.03.2010, 00:40
|
|
Матрос
|
|
Регистрация: 04.04.2008
Сообщений: 6,246
|
|
Сообщение от subzey
|
это задача для уровня БД
|
по логике-да
к сожалению, все известные мне решения на чистом MySQL весьма и весьма непродуктивны.
например ваше решение, как раз и есть то, за что вы осуждаете других
Сообщение от subzey
|
купить торт и съесть только вишенку
|
вычислить для каждой строки таблицы случайную величину, отсортировать эту кучу случайных чисел а затем взять только строку, или две.
|
|
|
|