Php случайная строка справки

0

Я создал некоторый код, который вернет случайную строку (ну, все строки в случайном порядке) Но я предполагаю, что он ОЧЕНЬ неэффективен и будет проблемой в большой базе данных...

Кто-нибудь знает лучший способ?

Вот мой текущий код:

$count3 = 1;
$count4 = 1;
//Civilian stuff...
$query = ("SELECT * FROM `*Table Name*` ORDER BY `Id` ASC");
$result = mysql_query($query);
while($row = mysql_fetch_array($result)) {
$count = $count + 1;
$civilianid = $row['Id'];
$arrayofids[$count] = $civilianid;
//echo $arrayofids[$count];
}

while($alldone != true) {
$randomnum = (rand()%$count) + 1;
//echo $randomnum . "<br>";
//echo $arrayofids[$randomnum] . "<br>";
$currentuserid = $arrayofids[$randomnum];
$count3 += 1;

while($count4 < $count3) {
$count4 += 1;
$currentarrayid = $listdone[$count4];
//echo "<b>" . $currentarrayid . ":" . $currentuserid . "</b> ";
if ($currentarrayid == $currentuserid){
$found = true;
//echo " '" .$found. "' ";
}
}

if ($found == true) {
//Reset array/variables...
$count4 = 1;
$found = false;
} else {
$listdone[$count3] = $currentuserid;
//echo "<u>" . $count3 .";". $listdone[$count3] . "</u> ";
$query = ("SELECT * FROM `*Tablesname*` WHERE Id = '$currentuserid'");
$result = mysql_query($query);
$row = mysql_fetch_array($result);
$username = $row['Username'];
echo $username . "<br>";
$count4 = 1;
$amountdone += 1;
if ($amountdone == $count) { //$count
$alldone = true;
}
}
}

В основном он будет зацикливаться до тех пор, пока не получит идентификатор (случайно), который еще не выбран. -Так последнее имя пользователя может занять несколько часов: P

Является ли это "плохим" кодом?: P: (

  • 0
    Если вы запутались, почему все переменные начинаются с 1, а не с 0, как массив, я не знаю, я просто решил, что все они должны: P
  • 0
    Не обращайте внимания на большинство комментариев, они просто помогали мне определить проблемы, когда я их просматривал ...
Теги:
loops
random

2 ответа

1

Вы можете делегировать это MySQL:

SELECT * FROM table_name ORDER BY RAND() LIMIT 1;

Он вернет случайную строку из вашей таблицы, которая, как я полагаю, должна быть более эффективной, чем ваше php-решение. Тем не менее, в большой базе данных она будет медленной.

Вам может быть интересно проверить следующие столбцы для альтернативных решений:

  • 0
    Является ли это «эффективным» - или что-то еще - в большой базе данных, это будет работать медленно? Редактировать: НВМ, вы обновили
  • 0
    Это не эффективно, потому что требует полного сканирования таблицы. Проверьте этот пост и этот .
Показать ещё 2 комментария
0

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

$query = ("SELECT * FROM `*Table Name*` ORDER BY RAND()");

Затем просто отобразите их все в простой цикл.

Или вы можете получить все результаты в массив, а затем рандомизировать порядок в массиве. Для этого вы можете использовать функцию php shuffle(). http://www.php.net/manual/en/function.shuffle.php

Я бы предположил, что первый вариант даст вам наилучшие результаты, но правильным решением будет измерение производительности и попытка оптимизации, если он "слишком медленный".

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

  • 0
    Shuffle () звучит хорошо для меня, но да, я всегда мог попробовать оба. Спасибо,

Ещё вопросы

Сообщество Overcoder
Наверх
Меню