Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 22.03.2010, 13:40
Аватар для subzey
Пионэр
Отправить личное сообщение для subzey Посмотреть профиль Найти все сообщения от subzey
 
Регистрация: 16.11.2009
Сообщений: 1,322

Gvozd,
да я и не спорю про эффективность. Что может быть шустрее, чем выборка двух значений по полю-индексу? (Более того, поколдовал я и так и сяк, и с JOIN и с "LIMIT {random}, 1", при нескольких тысячах строк результаты ужасают.)

Просто тогда надо быть очень внимательным и держать id в чистоте и порядке.

Да, и багрепорт, видимо, проигнорировали.

// допустим, $kol = 1;
$rnd = rand(1, $kol); // 1, всегда
while( ($rnd2 = rand(1, $kol)) ==$rnd); // бесконечный цикл
Ответить с цитированием
  #12 (permalink)  
Старый 22.03.2010, 15:51
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

Сообщение от subzey
Да, и багрепорт, видимо, проигнорировали.
Сообщение от Gvozd
это просто набор исключительных случаев, которые надо описать в логике PHP-скрипта, в пользу производительности.
достаточно несложно организовать ф-цию, которая это учтет.
так что это скорее вопрос уже формализации
Сообщение от subzey
Просто тогда надо быть очень внимательным и держать id в чистоте и порядке.
можно сделать проще:
$rnd = rand(1, $kol);

$db1 = mysql_fetch_assoc(mysql_query("SELECT * FROM writers ORDER BY id LIMIT ".$rnd.",1"));

если я правильно предполагаю, то такой запрос должен отрабатыватся за логарифм, также как и получение по id
Ответить с цитированием
  #13 (permalink)  
Старый 22.03.2010, 20:22
Аватар для subzey
Пионэр
Отправить личное сообщение для subzey Посмотреть профиль Найти все сообщения от subzey
 
Регистрация: 16.11.2009
Сообщений: 1,322

Сообщение не дошло (долбаный MTS!).

Лениво переписывать тираду, да и не вспомню уже, вкратце, проверил на живом сервере, а не дома на денвере, и метод с LIMIT оказался действительно неплох (0,02 с для 36000 строк).

Вот, только с ORDER BY он работает на порядок медленнее, действительно ли он нужен, учитывая, что порядок строк нам не особо-то и нужен.
Ответить с цитированием
  #14 (permalink)  
Старый 22.03.2010, 21:15
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

Сообщение от subzey
действительно ли он нужен
да нафих не сдался, если уж на то пошло.
Сообщение от subzey
работает на порядок медленнее
а поле проиндексировано?
Ответить с цитированием
  #15 (permalink)  
Старый 25.03.2010, 14:48
Аватар для Jekel
Профессор
Отправить личное сообщение для Jekel Посмотреть профиль Найти все сообщения от Jekel
 
Регистрация: 20.11.2009
Сообщений: 257

Теперь нужно три картинки выводить...три юзера. Как в этом случае сделать? так while ((($rnd3=rand(1, $db1n))==$rnd)==$rnd2); не работает(
<?php

mysql_connect($hostddd, $userdbddd, $passdbddd); 
mysql_select_db($databaseddd);

$db1n = mysql_num_rows(mysql_query("SELECT * FROM writers"));

$rnd = rand(1, $db1n);

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

$wri = "<a href='index.php?option=com_content&view=article&id=48#".$db1['id']."'>
<img src='http://localhost/writers/".$db1['photo']."'></img></a>
<br>
<b>".$db1['name']."</b><br><span style='font-size: 11px'>Age: ".$db1['age']."</span>
<br><span style='font-size: 11px'>Country of Residence: ".$db1['country']."</span>
<br><span style='font-size: 11px'>Degree: ".$db1['degree']."</span><br><br>";

while (($rnd2=rand(1, $db1n))==$rnd);

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

$wri2 = "<a href='index.php?option=com_content&view=article&id=48#".$db2['id']."'>
<img src='http://localhost/writers/".$db2['photo']."'></img></a>
<br>
<b>".$db2['name']."</b><br><span style='font-size: 11px'>Age: ".$db2['age']."</span>
<br><span style='font-size: 11px'>Country of Residence: ".$db2['country']."</span>
<br><span style='font-size: 11px'>Degree: ".$db2['degree']."</span><br><br>";

echo "<br>".$wri.$wri2;
?>

Последний раз редактировалось Jekel, 26.03.2010 в 00:12.
Ответить с цитированием
  #16 (permalink)  
Старый 25.03.2010, 15:50
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

$max=100;
$count=10;


$rand=array();$temp_rand=NULL;
for($i=0;$i<$count;$i++)
    {
    while(in_array($temp_rand=rand(1,$max),$rand));
    $rand[$i]=$temp_rand;
    }

Последний раз редактировалось Gvozd, 25.03.2010 в 23:59.
Ответить с цитированием
  #17 (permalink)  
Старый 25.03.2010, 16:03
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

$max=100;
$count=10;
$rand = array();
for ($i = 0; $i < $count; $i++) {
    $rand[$i] = rand(1, $max - $i);
    for ($j = 0; $j < $i; $j++) {
        if ($rand[$i] >= $rand[$j]) {
            $rand[$i]++;
        }
    }
}

$count равномерно распределённых случайных чисел.
Ответить с цитированием
  #18 (permalink)  
Старый 25.03.2010, 16:14
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

Kolyaj,
обоснуй
не очень-то похоже, что это будет равномерная выборка
более того, она и вправду неравномерная
для выборки 3х элементов из 4х, оно дает:
7 перестановок "123"
5 перестановок "124"

Последний раз редактировалось Gvozd, 25.03.2010 в 16:52.
Ответить с цитированием
  #19 (permalink)  
Старый 25.03.2010, 16:27
Аватар для Jekel
Профессор
Отправить личное сообщение для Jekel Посмотреть профиль Найти все сообщения от Jekel
 
Регистрация: 20.11.2009
Сообщений: 257

Не могу вьехать как его влепить туда....пожалуйста, можно на моем примере?
Ответить с цитированием
  #20 (permalink)  
Старый 25.03.2010, 16:53
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

Сообщение от Jekel
Не могу вьехать как его влепить туда
я дико извиняюсь, но это совсем элементарщина
код, не такой уж сложный, и полагаю без комментариев должно быть ясно что он делает, и как использовать его результат
Ответить с цитированием
Ответ



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

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